⑴ java 中的註解有哪些用處
Java 中的註解主要有以下幾種用途:
1. 標注數據:用於標注類、方法、變數、參數等元素,以便在編譯、運行時對它們進行處理。例如,可以使用註解來標記需要序列化的屬性、需要進行單元測試的方法等。
2. 生成文檔:通過註解可以自動生成代碼文檔,方便開發者查看和使用。例如,Spring 框架中的 @RequestMapping、@GetMapping、@PostMapping 等註解可以自動生成 API 文檔。
3. 控製程序流程:註解可以用於控製程序的執行流程,例如,可以使用 @Around 註解來實現攔截器,使用 @Transactional 註解來實現事務管理。
4. 代碼簡化:註解可以幫助開發者編寫更簡潔的代碼,減少重復代碼和模板化的代碼。例如,JUnit 框架中的 @Test、@Before、@After 等註解可以讓開發者更方便地編寫測試用例。
5. 配置管理:註解可以用於配置管理,例如,使用 @Configuration、@Bean、@Component、@Service、@Repository 等註解來定義 Spring 容器中的組件和依賴關系。
6. 編譯時檢查:註解可以在編譯時對代碼進行檢查,例如,使用 @Autowired、@NotNull、@Size 等註解來檢查代碼的正確性和安全性。
7. 運行時處理:註解可以在運行時對代碼進行處理,例如,使用 AOP(面向切面編程)框架中的註解來實現橫切關注點的處理。
⑵ Java編譯時註解和運行時註解有什麼區別
重寫,重載,泛型,分別是在運行時還是編譯時執行的
1. 方法重載是在編譯時執行的,因為,在編譯的時候,如果調用了一個重載的方法,那麼編譯時必須確定他調用的方法是哪個。如:
當調用evaluate("hello")時候,我們在編譯時就可以確定他調用的method #1.
2.
方法的重寫是在運行時進行的。這個也常被稱為運行時多態的體現。編譯器是沒有辦法知道它調用的到底是那個方法,相反的,只有在jvm執行過程中,才知曉到底是父子類中的哪個方法被調用了當有如下一個介面的時候,我們是無法確定到底是調用父類還是子類的方法
3.
泛型(類型檢測),這個發生在編譯時。編譯器會在編譯時對泛型類型進行檢測,並吧他重寫成實際的對象類型(非泛型代碼),這樣就可以被JVM執行了。這個過程被稱為"類型擦除"。
類型擦除的關鍵在於從泛型類型中清除類型參數的相關信息,並且再必要的時候添加類型檢查和類型轉換的方法。
類型擦除可以簡單的理解為將泛型java代碼轉換為普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java位元組碼。類型擦除的主要過程如下:
1). 將所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。
2). 移除所有的類型參數。
在編譯後變成:
4. 註解。註解即有可能是運行時也有可能是編譯時。
如java中的@Override註解就是典型的編譯時註解,他會在編譯時會檢查一些簡單的如拼寫的錯誤(與父類方法不相同)等
同樣的@Test註解是junit框架的註解,他是一個運行時註解,他可以在運行時動態的配置相關信息如timeout等。
5. 異常。異常即有可能是運行時異常,也有可能是編譯時異常。
RuntimeException是一個用於指示編譯器不需要檢查的異常。RuntimeException
是在jvm運行過程中拋出異常的父類。對於運行時異常是不需要再方法中顯示的捕獲或者處理的。
已檢查的異常是被編譯器在編譯時候已經檢查過的異常,這些異常需要在try/catch塊中處理的異常。
6. AOP. Aspects能夠在編譯時,預編譯時以及運行時使用。
1).
編譯時:當你擁有源碼的時候,AOP編譯器(AspectJ編譯器)能夠編譯源碼並生成編織後的class。這些編織進入的額外功能是在編譯時放進去的。
2). 預編譯時:織入過程有時候也叫二進制織入,它是用來織入到哪些已經存在的class文件或者jar中的。
3). 運行時:當被織入的對象已經被載入如jvm中後,可以動態的織入到這些類中一些信息。
7. 繼承:繼承是編譯時執行的,它是靜態的。這個過程編譯後就已經確定
8. 代理(delegate):也稱動態代理,是在運行時執行。