java註解學習---自定義註解定義java註解(二)

                           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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章