java 注解

本文详细介绍了Java注解的使用方式及四种元注解的功能:@Documented、@Inherited、@Retention 和 @Target。通过实例展示了如何利用这些元注解进行类、方法等的标记,并解释了它们的不同应用场景。
摘要由CSDN通过智能技术生成
  • 注解简介
  • 注解使用

注解简介 

注解java扩展标记一种形式,可以丰富java语言的多功能特性,可以使用注解来标记我们的类、属性、方法、构造函数等等。

java 保护 4中元注解,分别是 Documented、Inherited、Retention、Target

@Documented:

这个元注解表示注解可以文档化,什么意思,举个列子

@Documented //被标记的类可以文档化
@Inherited //注解可以继承
@Retention(RetentionPolicy.RUNTIME)//注解被jvm保留,反射可以拿到本注解的信息
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface AnnotationBean {
    /**
     * 是否需要打印日志
     */
    boolean needLog()  default false;

}
@AnnotationBean(needLog = true)
public class AnnotationTest {}

此时这个类可以被文档化,我们通过javadoc 命令来为我们生成文档

134050_Ju69_2663859.png

构建成功后生成的信息,打开index.html 可以看到被标记的Annotation 类生成了文档(一般这元注解很少用到)

134133_I0Eg_2663859.png

@Inherited

这个注解的作用是可以注解可继承,什么意思

public class AnnotationTest1 extends AnnotationTest {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c = Class.forName("main.test.annotationTest.AnnotationTest1");
        Annotation [] annotations = c.getAnnotations();
        System.out.println(annotations.length);
    }
}

刚刚我们在AnnotationTest类上标记了我们写的注解,如果把AnnotationBean 上的@Inherited去掉,就继承不到这个注解了

@Retention(SOURCE、CLASS、RUNTIME)

SOURCE:是编译时就被丢弃,也就是不会保存在class文件中(一般就是在编译的时候做点小动作,比如我们常用的@SuppressWarnings诛注解,这个注解是在编译的时候拟制警告)

CLASS:编译的时候保存在class 文件中,但是jvm加载class文件的时候不会读取注解(具体作用不明,但是可以用这个注解来注释类文件,应为这个注解没有被编译成而进制文件)

RUNTIME:编译的时候保存在class 文件中,但是jvm加载class文件的时候不会读取注解(其实注解被编译成了二进制,因为类加载其只会加载二进制数据,这个注解是我们最常用的注解,因为我们可以通过反射机制来读取注解来扩展项目功能)

最后举RUNTIME列子

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
    Class c = Class.forName("main.test.annotationTest.AnnotationTest");
    Field [] fields =  c.getDeclaredFields();
    for(Field field: fields){
        field.setAccessible(true);
        Annotation [] annotations = field.getDeclaredAnnotations();
        for(Annotation annotation : annotations){
            if(annotation instanceof AnnotationBean){
                //打印日志
                if(((AnnotationBean) annotation).needLog()){
                    c.getMethod("set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1),String.class).invoke(c.newInstance(),"我在测试");
                }

            }
        }
    }
}

 

 

 

 

转载于:https://my.oschina.net/chenping12/blog/1507075

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值