java—自定义注解

注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”。注解本身对代码逻辑没有任何影响,如何使用注解由注解解析工具决定(读注解、自定义逻辑)

元注解:用来修饰注解的注解

一、@Target() : 定义注解应用于哪些位置

 	类或接口:ElementType.TYPE;
	字段:ElementType.FIELD;
	方法:ElementType.METHOD;
	构造方法:ElementType.CONSTRUCTOR;
	方法参数:ElementType.PARAMETER。

二、@Retention:定义注解的生命周期,如果不定义则默认为RetentionPolicy.CLASS

 仅编译期:RetentionPolicy.SOURCE;
 仅class文件:RetentionPolicy.CLASS;
 运行期(自定义注解使用时常用):RetentionPolicy.RUNTIME。

三、@Inherited:当注解定义在类上时(Target = ElementType.TYPE),子类是否可以继承父类的注解(父类有注解,相当于子类也有了),不支持接口继承

四、@Documented:在生成javadoc的时候会把注解显示出来,不加不会显示

五:@Repeatable():定义注解是否可以在同一地方使用多次(jdk1.8新增)

/**
 * 用@interface定义注解
 * 用元注解来修饰注解
 * 没特殊需求正常只需要用@Target 和 @Retention来修饰自定义的注解
 */
@Target({
    
    ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Fields.class)
@Inherited
@Documented
public @interface Field {
    
    
    String value() default ""; // 没有默认值 default 则必填
}

/**
 * @Repeatable 注解的使用, Fields注解的作用域必须大于或者等于 Field注解作用域
 */
@Target({
    
    ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface Fields {
    
    
    Field[] value();
}

自定义注解:通过元注解修饰自定义的注解,通过反射读取注解,实现想要的功能。

注解:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Field {
    
    
    String value() default "";
}

读取注解:

public class User {
    
    

    @Field(value = "zqq")
    private String name;

    @Field(value = "18")
    private Integer age;

    private String sex;

    public static void main(String[] args) {
    
    
        User user = new User();
        Class c = user.getClass();
        Arrays.stream(c.getDeclaredFields()).forEach(f ->{
    
    
            //f.isAnnotationPresent(Field.class)判断是否有注解,f.getAnnotation(Field.class).value()获取注解的值
            if(f.isAnnotationPresent(Field.class)) System.out.println("字段:" + f.getName() + "有注解。注解值为:" + f.getAnnotation(Field.class).value());
        });
    }
}

猜你喜欢

转载自blog.csdn.net/zhaoqingquanajax/article/details/113700009