Java注解简述

Java注解简述

国庆假期前后,基本是看一下开源的项目,发现不少优秀的开源项目都用了注解和动态代理相关的知识,所以顺带有好好地研读了一下注解和动态代理,加深了对注解和动态代理的认识。博客都差不多接近要断了,前一段七七八八地看了各种东西,一直都没有写东西,懒惰了很多。整的现在很多东西都没有做好,突然觉得不仅仅是专业学习,其他的各种东西也应该有点追求。力求生活精致。

Java从JDK5开始引入了注解(Annotation),也称元数据,它可以用于创建文档,代码依赖性跟踪,甚至编译时的基本检查。注解基本格式是@注解名称。经常遇到的一个例子如下:

@Override
public String toString(){
    return "annotation string";
}

Java注解可以应用到包,类,方法,字段,局部变量上面。另外Java可以通过反射去读取注解的内容。

Java内置注解

Java内置了三个注解,定义在java.lang包里面:

  • Override:重载检查
  • Deprecated: 使用过时的代码的提示
  • SuppressWarnings:提醒,像uncheck,serial等

这些个也都是我们经常使用的注解,特别是Override,在继承的时候加上注解,能够对继承进行检查。像本文第一段代码就是使用了Override。下面这段就是Override的源码:

    package java.lang;
    import java.lang.annotation.*;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }

自定义注解

Java出了内置了注解,也同样是允许自定义注解的。自定义注解也跟Override的实现完全一样。比如说我们想要实现一个Hello注解,只需要使用如下代码:

    package java.lang;
    import java.lang.annotation.*;
    
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Hello {
        String haha() default "ha";
        String haha1() default "ha1";
    }

这样就可以像使用Override一样使用Hello注解了。其中@interface是声明一个注解,自动继承了java.lang.annotation.Annotation接口,编译器程序会完成其他部分,在定义注解时,不能继承其他注解或接口。@Retention是用来设置作用范围,默认时RetentionPolicy.CLASS,它也是一种保留范围,CLASS保留在class文件中,但VM运行时不保存,RUNTIME保留在class,运行时可以反射读取注解的值。

@Target是用来指定适用的元素种类。如果不添加的话,任何元素都能够使用。注解里面的方法是注解的变量,可以设置默认值,类型基本变量都可以。

读取注解的值

注解的值可以在运行的时候读取出来,只要@Retention设置为RUNTIME就能够被读取出来了。不过读取出来的具体方法就需要去了解下了。

比如我们使用之前定义的Hello注解

@Hello
class TestHello{
    @Hello(haha="haha")
    public void sayHello(){}
    
    @Hello(haha="hahastr")
    public void hello;
}

类注解

Class<TestHello> cl = TestHello.class
Hello h = cl.getAnnotation(Hello.class);
System.out.println(h.haha()+","+h.haha1());

函数注解

Class<TestHello> cl = TestHello.class
Method method = cl.getMethod("sayHello",new Class[0]);
Hello h = (Hello)method.getAnnotation(Hello.class);

字段,构造函数的使用方式都是一样的。程序可以在运行的时候读取注解

处理注解的工具APT

APT(Annotation Processing Tool)就是jdk在1.5提供的帮助注解处理过程的工具。它的作用是在编译源文件之前,通过一个自定义的注释处理器去解释并处理源文件的注释,并且由注释处理器生成一些新的源文件,字节码文件,或其他文本文件。APT也会对新的源文件进行处理,知道没有新的源文件产生。

使用了注解的一些工具

现在很多开源第三方Android项目都是使用了注解,

像依赖注入库Dagger就是使用了很多注解去实现注入,并且利用注解处理工具在编译时生成辅助类,在运行时完成注入。

另外又比如ButterKnife,也是一种依靠注入的开源库,不过ButterKnife是Android中通过id自动绑定java中的View变量与layout中描述的View的一个开源库。

以及我前面看过的Retrofit,那是一个将Http访问简化成与ORM一样的开源库。很多第三方库都使用注解来方便开发者使用,但是其中的原理还是应该了解一下。

Spring中用到的注解就更多了,以及很多ORM都是用注解方便开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值