java注解

注解 :Annotaction当我们进行框架配置的时候,XML中配置太多导致维护不方便,使用注解来减少配置文件,增加开发效率,注解就是在代码中添加信息,提供一种形式化的方法JDK1.5之后产生的新功能。

jdk内置注解:

@OverRide放在方法之前,如果加上此注解的方法不是复写超类的方法,就会报错
@Deprecated:声明程序已经过时,或者有更好的替代方案,不建议别人调用。
@SuppressWarnings:抑制编译器警告

元注解:简单的说就是定义在注解上的注解

@Target:声明注解用于什么地方
@Retention:注解的保存级别:
@Documented:会被javadoc提成文档
@Inherited:允许子类继承父类的注解

自定义注解(Annotation),也叫元数据:

一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

@Override是一个简单的编译时注解,它可以用来捕获类似于在子类中把toString()写成tostring()这样的错误。在Java5中,用户自定义的注解可以用注解处理工具(Anotation Process Tool ——APT)在编译时进行处理。到了Java6,这个功能已经是编译器的一部分了。

@Test是JUnit框架用来在运行时通过反射来决定调用测试类的哪个(些)方法的注解。

@Deprecated标记就表明这个方法已经过时了

@Override的时候就能想到这个方法是覆盖了某个接口的方法的。

@SuppressWarnings(“deprecation”)就表示我们忽略了deprecation这样的一个警告。

注解保持性策略

在Java编译器编译时,它会识别在源代码里添加的注解是否还会保留,这就是RetentionPolicy。下面是Java定义的RetentionPolicy枚举:
编译器的处理有三种策略:
将注解保留在编译后的类文件中,并在第一次加载类时读取它;
将注解保留在编译后的类文件中,但是在运行时忽略它;
按照规定使用注解,但是并不将它保留到编译后的类文件中。

注解分类:【源码注解→编译时注解→运行时注解】
源码注解:只在源码中存在,编译成.class文件就不存在了。
编译时注解:在源码和.class文件中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他们都属于编译时注解。
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。像@Autowired自动注入的这样一种注解就属于运行时注解,它会在程序运行的时候把你的成员变量自动的注入进来。
按照来源划分: 来自JDK的注解——来自第三方的注解——自定义注解

解析注解

概念:

通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

测试类:

@Description("bb")
public static void main(String[] args) {
    try {
        // 使用类加载器加载类
        Class c = Class.forName("com.anno.test");
        // 找到类上面的注解
        boolean isExist = c.isAnnotationPresent(Description.class);
        // 上面的这个方法是用这个类来判断这个类是否存在Description这样的一个注解
        if (isExist) {
            // 拿到注解实例,解析类上面的注解
            Description d = (Description) c.getAnnotation(Description.class);
            System.out.println("111:"+d.value());
        }


        //获取所有的方法
        Method[] ms = c.getMethods();
        // 遍历所有的方法
        for (Method m : ms) {
            boolean isExist1 = m.isAnnotationPresent(Description.class);
            if (isExist1) {
                Description d1=m.getAnnotation(Description.class);
                System.out.println(d1.value());
            }
        }

        //另一种解析方法
        for (Method m : ms) {
            //拿到方法上的所有的注解
            Annotation[] as=m.getAnnotations();
            for (Annotation a : as) {
                //用二元操作符判断a是否是Description的实例
                if (a instanceof Description) {
                    Description d=(Description) a;
                    System.out.println(d.value());
                }
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值