自定义注解

在工作中虽然很少用到,但是我们阅读源码的时候需要去了解自定义注解的做法,了解自定义注解有助于我们更好的阅读源码。
自定义注解很简单,但是有些细节需要注意的。
1、新创建一个entity

@Getter
@Setter
@ToString
@Entity("city") // 这个是我们自定义的注解
public class CityEntity {
    private int id ;
    private String name ;
}

2、我们去创建自定义注解

// 指定注解的位置 Type是放在class上面  还有method  field 等等
@Target(ElementType.TYPE)
// 指定自定义主机的生命周期  默认的生命周期在运行时就结束了
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
	// 默认的是value方法  也就是  @Entity("xxx")  其实对应的就是value  其中default "" 对应的是 @Entity() 
    public String value() default "";
}

3、我们写一个帮助类,传入一个Object类型的类 获取value的值

public static String getAnnotationValue(Object object) {
        // 通过反射获取到class
        Class clazz = object.getClass() ;
        // 判断class是否有这个注解
        if(clazz.isAnnotationPresent(Entity.class)) {
            // 获取到自定义注解
            Entity entity = (Entity) clazz.getAnnotation(Entity.class);
            String value = entity.value() ;
            System.out.println(value);
        }
        return null ;
    }

4、我们通过测试类测试一下

public static void main(String[] args) {
        CityEntity cityEntity = new CityEntity() ;
        CommUtil.getAnnotationValue(cityEntity) ;
    }

结果:
在这里插入图片描述
这样我们就获取到了value的值了

其中需要注意:
在这里插入图片描述
我们需要指定生命周期,如果我们指定的话 默认的是Class
clazz.isAnnotationPresent(Entity.class) 这段判断该类是否有注解会得到false,因此我们需要设定他的生命周期
在这里插入图片描述
根据不同的情况选择不同的生命周期

  1. SOURCE:在编译时丢弃
  2. CLASS:会被保留在类文件中,但是运行时VM不保留
  3. RUNTIME:编译和运行时保留,可以通过反射读取。
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章