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注解学习---@Target({ElementType.PACKAGE})理解和使用(三)


   java注解学习---@Inherited注解的理解学习(四)   



猜你喜欢

转载自blog.csdn.net/haha_sir/article/details/80753721