java註解學習---自定義註解定義java註解(二)
一、 自定義 @Target相關注解
1、@Target=ElementType.TYPE 支持類,接口,枚舉註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.ANNOTATION_TYPE 支持 註解類型 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:11:21
*
*/
@Target({ElementType.ANNOTATION_TYPE})
@Documented
public @interface HaHaTargetAnnotationType {
}
2、@Target=ElementType.FIELD 支持 字段,枚舉註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.FIELD 支持 字段,枚舉註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午12:59:34
*
*/
@Target(ElementType.FIELD)
@Documented
public @interface HaHaTargetField {
}
3、@Target=ElementType.METHOD 支持 方法 註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.METHOD 支持 方法 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:04:07
*
*/
@Target(value={ElementType.METHOD})
@Documented
public @interface HaHaTargetMethod {
}
4、@Target=ElementType.PARAMETER 支持 方法參數 註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.PARAMETER 支持 方法參數 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:06:02
*
*/
@Target(ElementType.PARAMETER)
@Documented
public @interface HaHaTargetParameter {
}
5、@Target=ElementType.CONSTRUCTOR 支持 構造方法 註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.CONSTRUCTOR 支持 構造方法 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:07:19
*
*/
@Target(ElementType.CONSTRUCTOR)
@Documented
public @interface HaHaTargetConstructor {
}
6、@Target=ElementType.LOCAL_VARIABLE 支持 局部變量 註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.LOCAL_VARIABLE 支持 局部變量 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:09:49
*
*/
@Target(ElementType.LOCAL_VARIABLE)
@Documented
public @interface HaHaTargetLocalVariable {
}
7、@Target=ElementType.ANNOTATION_TYPE 支持 註解類型 註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.ANNOTATION_TYPE 支持 註解類型 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:11:21
*
*/
@Target({ElementType.ANNOTATION_TYPE})
@Documented
public @interface HaHaTargetAnnotationType {
}
8、@Target=ElementType.PACKAGE 支持 包 註解
package com.haha.study.annotation.target;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @description: 自定義註解 --- @Target=ElementType.PACKAGE 支持 包 註解
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:14:03
*
*/
@Target({ElementType.PACKAGE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HaHaTargetPackage {
String version() default "1.0";
}
二、定義 @Retention相關注解
1、@Retention=RetentionPolicy.SOURCE 註解 不會被編譯到 .class 文件中
package com.haha.study.annotation.retention;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @description: 自定義註解 --- @Retention=RetentionPolicy.SOURCE 註解 不會被編譯到 .class 文件中
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:16:24
*
*/
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface HaHaRetentionSource {
}
2、@Retention=RetentionPolicy.CLASS 註解會被編譯到 .class文件中,但不會被虛擬機加載。 (缺省 默認這個)
package com.haha.study.annotation.retention;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @description: 自定義註解 --- @Retention=RetentionPolicy.CLASS 註解會被編譯到 .class文件中,但不會被虛擬機加載
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:36:51
*
*/
@Retention(RetentionPolicy.CLASS)
@Documented
public @interface HaHaRetentionClass {
}
3、@Retention=RetentionPolicy.RUNTIME 註解會被編譯到 .class文件中,且也會被虛擬機加載到內存中 ---> 可通過反射獲取註解信息
package com.haha.study.annotation.retention;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @description:自定義註解 --- @Retention=RetentionPolicy.RUNTIME 註解會被編譯到 .class文件中,且
* 也會被虛擬機加載到內存中 ---> 可通過反射獲取註解信息
* @version:v1.0
* @author:w
* @date:2018年6月17日下午1:39:22
*
*/
@Retention(value=RetentionPolicy.RUNTIME)
@Documented
public @interface HaHaRetentionRuntime {
}
三、使用自定義註解
package com.haha.study.annotation;
import com.haha.study.annotation.documented.HaHaDocumented;
import com.haha.study.annotation.inherited.HaHaInherted;
import com.haha.study.annotation.retention.HaHaRetentionRuntime;
import com.haha.study.annotation.target.HaHaTargetConstructor;
import com.haha.study.annotation.target.HaHaTargetField;
import com.haha.study.annotation.target.HaHaTargetLocalVariable;
import com.haha.study.annotation.target.HaHaTargetMethod;
import com.haha.study.annotation.target.HaHaTargetParameter;
import com.haha.study.annotation.target.HaHaTargetType;
/**
* description 基於四個元註解,創建的自定義註解,測試。 @HaHaTargetPackage 單獨講解. (description)
* @version v1.0
* @author w
* @date 2018年6月17日下午7:01:39
*
*/
@HaHaTargetType
@HaHaDocumented
@HaHaInherted
@HaHaRetentionRuntime
public class AnnotationDemo {
@HaHaTargetField
private String userName;
/**
* @description 這是一個構造方法!
* @see this constructor
* @param userName
*/
@HaHaTargetConstructor
public AnnotationDemo(@HaHaTargetParameter String userName){
this.userName=userName;
}
/**
* @description 普通方法測試。
* @param no params
* @return 沒有返回值
* @version v1.0
* @author w
* @date 2018年6月17日 20:16:43
*
*/
@HaHaTargetMethod
public void sayHello(){
@HaHaTargetLocalVariable
String info="userName : "+userName;
System.out.println(info);
}
public static void main(String[] args) {
AnnotationDemo demo=new AnnotationDemo("xiaoMing");
demo.sayHello();
}
}
四、總結
1、使用四種元註解,自定義註解注意幾點:
- @Target(ElementType.?) 根據實際需求定義,不建議定義爲 @HaHaTargetAll
- 註解定義爲: @Retention(RetentionPolicy.RUNTIME) 便於反射中獲取,除非這個註解
作用類似於 @Override 用於編譯前限定。
- @Documented 添加上,便於生成 javadoc 。 參考 jdk內置三個註解都加上了。
- @Inherited 添加上,當前可能是不需要的,指不定兩個被註解類就存在繼承關係。
- 上面演示的註解 @HaHa** 爲了便於理解,都沒在註解中定義元素。 註解中定義元素格式
爲: 註解元素類型 元素名() [ default 元素值 ] , 如: int order() default 1; 其中元素名爲 value 時,在使用中可以省略不寫。
---- 沒看懂,回去看看 :
java註解學習---元註解,註解類型,註解支持元素類型,註解基礎(一)
---- 繼續學習 next :
java註解使用、java獲取註解的屬性、獲取註解的字段值 (新增)
java註解學習---@Target({ElementType.PACKAGE})理解和使用(三)
java註解學習---@Inherited註解的理解學習(四)
參考資料: http://zy19982004.iteye.com/blog/1979208