国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Java > 正文

java語(yǔ)言注解基礎(chǔ)概念詳解

2024-07-13 10:15:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1、RetentionPolicy.SOURCE:注解只保留在源文件,當(dāng)Java文件編譯成class文件的時(shí)候,注解被遺棄;

2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加載class文件時(shí)候被遺棄,這是默認(rèn)的生命周期;

3、RetentionPolicy.RUNTIME:注解不僅被保存到class文件中,jvm加載class文件之后,仍然存在;

這3個(gè)生命周期分別對(duì)應(yīng)于:Java源文件(.java文件)--->.class文件--->內(nèi)存中的字節(jié)碼。

那怎么來(lái)選擇合適的注解生命周期呢?

首先要明確生命周期長(zhǎng)度SOURCE<CLASS<RUNTIME,所以前者能作用的地方后者一定也能作用。一般如果需要在運(yùn)行時(shí)去動(dòng)態(tài)獲取注解信息,那只能用RUNTIME注解;如果要在編譯時(shí)進(jìn)行一些預(yù)處理操作,比如生成一些輔助代碼(如ButterKnife),就用CLASS注解;如果只是做一些檢查性的操作,比如@Override和@SuppressWarnings,則可選用SOURCE注解。

下面來(lái)介紹下運(yùn)行時(shí)注解的簡(jiǎn)單運(yùn)用。

獲取注解

你需要通過(guò)反射來(lái)獲取運(yùn)行時(shí)注解,可以從Package、Class、Field、Method...上面獲取,基本方法都一樣,幾個(gè)常見(jiàn)的方法如下:

/**  * 獲取指定類(lèi)型的注解  */public <A extends Annotation> A getAnnotation(Class<A> annotationType);/**  * 獲取所有注解,如果有的話(huà)  */public Annotation[] getAnnotations();/**  * 獲取所有注解,忽略繼承的注解  */public Annotation[] getDeclaredAnnotations();/**  * 指定注解是否存在該元素上,如果有則返回true,否則false  */public Boolean isAnnotationPresent(Class<? extends Annotation> annotationType);/**  * 獲取Method中參數(shù)的所有注解  */public Annotation[][] getParameterAnnotations();

要使用這些函數(shù)必須先通過(guò)反射獲取到對(duì)應(yīng)的元素:Class、Field、Method等。

自定義注解

來(lái)看下自定義注解的簡(jiǎn)單使用方式,這里先定義3個(gè)運(yùn)行時(shí)注解:

// 適用類(lèi)、接口(包括注解類(lèi)型)或枚舉 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ClassInfo {   String value(); } // 適用field屬性,也包括enum常量 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FieldInfo {   int[] value(); } // 適用方法 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MethodInfo {   String name() default "long";   String data();   int age() default 27; } 

這3個(gè)注解分別適用于不同的元素,并都帶有不同的屬性,在使用注解是需要設(shè)置這些屬性值。

再定義一個(gè)測(cè)試類(lèi)來(lái)使用這些注解:

/**  * 測(cè)試運(yùn)行時(shí)注解  */@ClassInfo("Test Class") public class TestRuntimeAnnotation {	@FieldInfo(value = {1, 2}) 	  public String fieldInfo = "FiledInfo";	@FieldInfo(value = {10086}) 	  public int i = 100;	@MethodInfo(name = "BlueBird", data = "Big") 	  public static String getMethodInfo() {		return TestRuntimeAnnotation.class.getSimpleName();	}}

使用還是很簡(jiǎn)單的,最后來(lái)看怎么在代碼中獲取注解信息:

/**  * 測(cè)試運(yùn)行時(shí)注解  */private void _testRuntimeAnnotation() {	StringBuffer sb = new StringBuffer();	Class<?> cls = TestRuntimeAnnotation.class;	Constructor<?>[] constructors = cls.getConstructors();	// 獲取指定類(lèi)型的注解 	sb.append("Class注解:").append("/n");	ClassInfo classInfo = cls.getAnnotation(ClassInfo.class);	if (classInfo != null) {		sb.append(Modifier.toString(cls.getModifiers())).append(" ") 		        .append(cls.getSimpleName()).append("/n");		sb.append("注解值: ").append(classInfo.value()).append("/n/n");	}	sb.append("Field注解:").append("/n");	Field[] fields = cls.getDeclaredFields();	for (Field field : fields) {		FieldInfo fieldInfo = field.getAnnotation(FieldInfo.class);		if (fieldInfo != null) {			sb.append(Modifier.toString(field.getModifiers())).append(" ") 			          .append(field.getType().getSimpleName()).append(" ") 			          .append(field.getName()).append("/n");			sb.append("注解值: ").append(Arrays.toString(fieldInfo.value())).append("/n/n");		}	}	sb.append("Method注解:").append("/n");	Method[] methods = cls.getDeclaredMethods();	for (Method method : methods) {		MethodInfo methodInfo = method.getAnnotation(MethodInfo.class);		if (methodInfo != null) {			sb.append(Modifier.toString(method.getModifiers())).append(" ") 			          .append(method.getReturnType().getSimpleName()).append(" ") 			          .append(method.getName()).append("/n");			sb.append("注解值: ").append("/n");			sb.append("name: ").append(methodInfo.name()).append("/n");			sb.append("data: ").append(methodInfo.data()).append("/n");			sb.append("age: ").append(methodInfo.age()).append("/n");		}	}	System.out.print(sb.toString());}

所做的操作都是通過(guò)反射獲取對(duì)應(yīng)元素,再獲取元素上面的注解,最后得到注解的屬性值。

看一下輸出情況,這里我直接顯示在手機(jī)上:

java語(yǔ)言,注解

總結(jié)

以上就是本文關(guān)于java語(yǔ)言注解基礎(chǔ)概念詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 连城县| 龙岩市| 雅江县| 尉犁县| 阿合奇县| 句容市| 安宁市| 准格尔旗| 宁强县| 民勤县| 东台市| 隆子县| 灯塔市| 昔阳县| 嫩江县| 子长县| 炎陵县| 星子县| 平和县| 南京市| 高要市| 株洲市| 峨边| 和静县| 金川县| 镇沅| 永修县| 苍溪县| 吴江市| 铜鼓县| 沅江市| 广平县| 宁国市| 万安县| 象山县| 金湖县| 普定县| 资讯 | 兖州市| 比如县| 海兴县|