在工作中虽然很少用到,但是我们阅读源码的时候需要去了解自定义注解的做法,了解自定义注解有助于我们更好的阅读源码。
自定义注解很简单,但是有些细节需要注意的。
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,因此我们需要设定他的生命周期
根据不同的情况选择不同的生命周期
- SOURCE:在编译时丢弃
- CLASS:会被保留在类文件中,但是运行时VM不保留
- RUNTIME:编译和运行时保留,可以通过反射读取。