5.注解

作者: 峰子1994 | 来源:发表于2017-08-08 12:08 被阅读6次
    1.注解的概念
    Annotation
    注解:给程序带上一些标记,从而影响编译器运行程序的结果!!!
    注释:提高程序的可读性,对程序运行没有影响!!!
    注解的作用:
        1)可以在程序上(类,方法,属性)携带信息
        2)注解简化(取代)配置文件(xml或properties)
    每个框架都有两种方案:
        1)把参数放在xml文件中
            2)把参数放在注解中
    
    2.常见的注解
    /**
     * 1)告诉编译器强制对方法进行覆盖
     */
        @Override
        public String toString() {
            return super.toString();
        }
        /**
         * 2)告诉编译器压制代码中出现的警告
         * @return
         */
        @SuppressWarnings(value = { "unchecked" })
        public List save(){
            List list = new ArrayList();
            return list;
        }
        /**
         * 3)在运行时让方法提示过期
         */
        @Deprecated
        public void update(){
        }
    
    3.定义注解语法
    public @interface Author {
    }
    
    4.带有属性的注解
    public @interface Author {
        //声明属性
        String name();
        String modifyTime();
    }
    
    5.注解注意的细节:
    5.2 注解细节
        1)属性的类型可以基本数据类型。也可以是数组类型
        2)使用default关键子给注解一个默认值
        3)当注解中使用value名称的属性,则可以省略“value=”不写      
    public @interface Author {
    
        //声明属性
        String name();
        String modifyTime() default "2015-06-25";//给属性带上默认值
        String[] address();//带有数组类型的属性
        //如果注解的属性名称为value,那么在使用注解的时候可以不写value=
        String[] value();
        //String[] names();
        //String value();
    }
    
    5.元注解的概念(在注解里面在加上注解)
    5.3 元注解
    @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
    声明注解的使用范围.
    TYPE: 注解可以用在类上
    FIELD:注解可以用在属性上
    METHOD:用在方法上
    PARAMETER:用在参数声明上面
    CONSTRUCTOR:用在构造方法上面
    LOCAL_VARIABLE:用在本地变量上面
    
    @Retention(RetentionPolicy.SOURCE)
    声明注解的有效范围
    RetentionPolicy.SOURCE: 该注解只在源码中有效!
    RetentionPolicy.CLASS:  该注解在源码中,和字节码中有效!(默认)
    RetentionPolicy.RUNTIME: 该注解在源码中,和字节码中有效,运行字节码的时候有效!
    
    6.反射注解
    使用反射技术获取(类,方法,属性)注解的信息
    //1)得到save方法对象
    Method m = this.getClass().getMethod("save", null);
    //2)得到方法上面的注解
    Author author = m.getAnnotation(Author.class);
    System.out.println(author);
    //3)获取注解里面的属性(数据)
    String name = author.name();
    String time = author.modifyTime();
    System.out.println(name);
    System.out.println(time);
    
    7.反射注解的案例(重点)
    改造泛型DAO的案例:
    问题: 当具体的实体类对象的属性和表的字段不一致时,BaseDao就无法使用了!!这时需要使用注解绑定类和表名,属性和字段的关系。改造后的实体对象如下
    
    8.反射注解的实现代码
    /**
     * 表的注解
     * @author APPle
     *
     */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Table {
        String name();//数据的表名
    }
    
    /**
     * 字段的注解
     * @author APPle
     *
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Column {
        String name();//字段名称
    }
    
    
    @Table(name = "teacher_list")
    public class Teacher {
        
        @Column(name = "tid")
        private int id;
        
        @Column(name = "tname")
        private String name;
        
        @Column(name = "tage")
        private int age;
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Teacher [age=" + age + ", id=" + id + ", name=" + name + "]";
        }
    }
    

    相关文章

      网友评论

          本文标题:5.注解

          本文链接:https://www.haomeiwen.com/subject/nprtrxtx.html