區別如下:
1)編譯時註解,註解內容只存在源文件,在編譯期間將被丟棄,不能通過JVM獲取註解信息;
2)運行時註解,編譯時被存儲在.class位元組碼文件,可以通過JVM運行時獲取註解信息(且只限於被RUNTIME註解的註解)。
『貳』 怎麼動態給java註解參數賦值
動態賦值指的是在配置文件配置好然後在項目中動態讀取?如果是這樣的話:
1.在xml文件中使用<context:property-placeholder location="」/>
這種方式可以讀取location指定位置對應的文件,引用的話使用${key}可以獲取對應的數據
和這種寫法相同的還有
<bean class=「com.spring….config.PropertyPlaceholderConfigurer」>
<property name=「locations">
<array><value></value></array>
</property>
<bean>
這種是用bean來載入配置文件,看起來更直觀
2.通過@Value註解讀取配置
這種方法也需要預先在xml文件中設定好配置文件的位置
<bean id=「prop」 class=「org.springframework.beans.factory.config.PropertiesFactoryBean」>
<property name=「locations」>
<array>
<value>classpath:.properties</value>
</array>
</property>
</bean>
之後在java代碼裡面可以用#{prop.key}來獲取對應的數據prop是bean的名字,key是配置文件的鍵。
3.使用@PropertySource
在springboot中,可以不需要xml文件來設置配置文件,在需要使用配置文件的類名字前加上
@PropertySource(「locations")就可以讀取指定位置的配置,在代碼中使用@Value註解可以獲取這些數據
@Value(value = 「${key}」)
4.使用@ConfigurationProperties(prefix=「」)
SpringBoot項目有時候會使用application.yml來存儲配置信息,一般情況下這些數據的存儲格式是
a:
key1:value1
key2:value2
這種嵌套方式,當然可以多層嵌套
在需要使用配置文件的類上面使用@ConfigurationProperties(prefix=「a」)可以獲取a標簽下一層所有的配置的鍵值對。
『叄』 C#怎麼動態生成方法和Summary注釋
C#中新建的類庫添加註釋時,應注意以下問題:
1、編譯動態類庫時命名空間要規范,一般不要和類同名,命名空間一般定義格式:項目名+類文件名;
2、動態類庫中,類、方法的注釋都採用下列方式注釋:
類注釋的格式:
///
<summary>
///
文件名:Ini處理類/
///
文件功能描述:讀寫Ini文件/
///
版權所有:Copyright
(C)
ZGM/
///
創建標識:2011.12.13/
///
修改標識:/
///
修改描述:/
///
</summary>
方法注釋的格式:
///
<summary>
///
讀出Ini文件
///
</summary>
///
<param
name="Section">Ini文件中的段落名稱</param>
///
<param
name="Key">Ini文件中的關鍵字</param>
///
<param
name="IniFilePath">Ini文件的完整路徑和名稱</param>
///
<returns>Ini文件中關鍵字的數值</returns>
3、生成與動態類庫相同名稱的xml文件,具體設置是:項目右鍵—>屬性—>生成—>XML文檔文件選中再編譯
4、引用動態類庫時,把類庫和同名的xml文件放到同一個文件夾內即可。
『肆』 C#怎麼動態生成方法和Summary注釋
C#中新建的類庫添加註釋時,應注意以下問題:
1、編譯動態類庫時命名空間要規范,一般不要和類同名,命名空間一般定義格式:項目名+類文件名;
2、動態類庫中,類、方法的注釋都採用下列方式注釋:
類注釋的格式:
/// <summary>
/// 文件名:Ini處理類/
/// 文件功能描述:讀寫Ini文件/
/// 版權所有:Copyright (C) ZGM/
/// 創建標識:2011.12.13/
/// 修改標識:/
/// 修改描述:/
/// </summary>
方法注釋的格式:
/// <summary>
/// 讀出Ini文件
/// </summary>
/// <param name="Section">Ini文件中的段落名稱</param>
/// <param name="Key">Ini文件中的關鍵字</param>
/// <param name="IniFilePath">Ini文件的完整路徑和名稱</param>
/// <returns>Ini文件中關鍵字的數值</returns>
3、生成與動態類庫相同名稱的xml文件,具體設置是:項目右鍵—>屬性—>生成—>XML文檔文件選中再編譯
4、引用動態類庫時,把類庫和同名的xml文件放到同一個文件夾內即可。
『伍』 retention原型
Retention註解有一個屬性value,是RetentionPolicy類型的,Enum RetentionPolicy是一個枚舉類型,
這個枚舉決定了Retention註解應該如何去保持,也可理解為Rentention 搭配 RententionPolicy使用。
RetentionPolicy有3個值:CLASS RUNTIME SOURCE
按生命周期來劃分可分為3類:
1、RetentionPolicy.SOURCE:註解只保留在源文件,當Java文件編譯成class文件的時候,註解被遺棄;
2、RetentionPolicy.CLASS:註解被保留到class文件,但jvm載入class文件時候被遺棄,這是默認的生命周期;
3、RetentionPolicy.RUNTIME:註解不僅被保存到class文件中,jvm載入class文件之後,仍然存在;
這3個生命周期分別對應於:Java源文件(.java文件) —> .class文件 —> 內存中的位元組碼。
那怎麼來選擇合適的註解生命周期呢?
首先要明確生命周期長度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方後者一定也能作用。
一般如果需要在運行時去動態獲取註解信息,那隻能用 RUNTIME 註解,比如@Deprecated使用RUNTIME註解
如果要在編譯時進行一些預處理操作,比如生成一些輔助代碼(如 ButterKnife),就用 CLASS註解;
如果只是做一些檢查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 註解。
註解@Override用在方法上,當我們想重寫一個方法時,在方法上加@Override,當我們方法的名字出錯時,編譯器就會報錯
註解@Deprecated,用來表示某個類或屬性或方法已經過時,不想別人再用時,在屬性和方法上用@Deprecated修飾
註解@SuppressWarnings用來壓製程序中出來的警告,比如在沒有用泛型或是方法已經過時的時候
『陸』 如何獲取java代碼中的注釋
以前itjob老師講過,使用eclipse生成文檔(javadoc)主要有三種方法:
1,在項目列表中按右鍵,選擇Export(導出),然後在Export(導出)對話框中選擇java下的javadoc,提交到下一步。
在Javadoc Generation對話框中有兩個地方要注意的:
javadoc command:應該選擇jdk的bin/javadoc.exe
destination:為生成文檔的保存路徑,可自由選擇。
按finish(完成)提交即可開始生成文檔。
2,用菜單選擇:File->Export(文件->導出),
剩下的步驟和第一種方法是一樣的。
3,選中要生成文檔的項目,然後用菜單選擇,
Project->Generate Javadoc直接進入Javadoc Generation對話框,剩餘的步驟就和第一種方法在Javadoc Generation對話框開始是一樣的。
『柒』 java反射無法動態獲取註解
@Action
public void test() throws NoSuchMethodException, SecurityException{
StackTraceElement[] stack = new Throwable().getStackTrace();
Method method = this.getClass().getMethod(stack[0].getMethodName());
for(Annotation an : method.getAnnotations()){
System.out.println(an);
}
}
也可以寫個公共方法來獲取,stack[0]這里要改成stack[1]
『捌』 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):也稱動態代理,是在運行時執行。