• java 高级特性——注解


    注解:

    可以作为配置信息控制程序的运行,注解可以在一些场合用来替代配置文件
    Annotation 注解: 程序中给人看到提示信息叫注释,
    给程序看的提示信息叫做注解
    形式: @xxxx(….)

    jdk1.5内置的注解:


    @Override : 限定重写父类方法, 该注解只能用于方法
    @Deprecated : 用于表示某个程序元素(类, 方法等)已过时
    @SuppressWarnings : 抑制编译器警告.

    自定义注解:


    1.声明注解

    (1) 使用 @interface关键字来定义注解,在这个类中可以声明注解的属性

                注解属性的声明类似于在为接口声明一个方法,同时可以为属性设定默认值
                注解属性支持如下类型:String、基本数据类型、枚举、Class 、其它注解类型、以上数据类型相应一维数组
                如果注解中只包含一个名为value的属性,则这个属性在使用时可以省略注解的名字直接写值
    
        public @interface tran{
            //String name();  
            //String name2() default "xxx";
            String value();//默认就有的属性
        } 

    (2)使用元注解对注解进行描述

    @Retention:用来指定注解的保留范围

    RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释

    RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解. 这是默认值,用于虚拟机加载类的时候

    !! RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注释

    @Target:指定被修饰的注解可以使用在什么位置

       ElementType的成员变量。可以是类/方法/字段/构造方法/包声明…..

    @Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.

    @Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解

    2.使用注解

    在 @Target声明的位置上使用 @Tran(属性名=属性值,…..)

    3.反射注解

      JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 该接口代表程序中可以接受注释的程序元素,包括Class 、Field、 Method 、Constructor、Package都是这个接口的实现,所以这个接口中定义的反射注解的方法,他们都具有

    <T extends Annotation>  T  getAnnotation(Class<T> annotationClass) 

      如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

        Annotation[] getAnnotations() 

      返回此元素上存在的所有注释。

    Annotation[] getDeclaredAnnotations() 
    

      返回直接存在于此元素上的所有注释。

    boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 

       如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
       

    如何获取注解上的属性?   获取到注解对象后,就像调用方法一样后去获取注解的属性 ———- 代码示例 定义一个注解:

    @Retention(RetentionPolicy.RUNTIME)     //指定保留范围
    @Target(ElementType.TYPE)
    public @interface DemoAnno {
        public String name();
        public int age() default 100;
    }

    定义一个类,并使用注解,同时给注解上的属性赋值:

    @DemoAnno(name="zhangsan")
    public class Student {
    }

    测试程序: 如果这个方法上带有@DemoAnno 则打印相应的name和age:

    public class Demo {
        public static void main(String[] args) {
            Class sc = Student.class;
            if(sc.isAnnotationPresent(DemoAnno.class)){
                DemoAnno da = (DemoAnno) sc.getAnnotation(DemoAnno.class);
                String name = da.name();
                int age = da.age();
                System.out.println(name+":"+age);
            }else{
                System.out.println("没有注解");
            }
        }
    }
  • 相关阅读:
    java动态编译 (java在线执行代码后端实现原理)(二)
    java动态编译 (java在线执行代码后端实现原理)
    自己根据java的LinkedList源码编写的一个简单的LinkedList实现
    postman中 form-data、x-www-form-urlencoded、raw、binary的区别
    什么是Base64加密?为什么要有Base64加密?
    js获取上个月的第一天和最后一天
    js一个数组变为指定长度的多个数组
    java人民币转大写中文
    三天打鱼两天晒网
    一句便是一首【一】
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932908.html
Copyright © 2020-2023  润新知