zoukankan      html  css  js  c++  java
  • 注解 如何自定义注解 注解的解析

    什么是注解?

    package com.bjsxt.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 注解的作用
     * 1.可以解释程序含义
     * 2.被其他程序使用
     * 注解的格式:
     * "@注解名" 还可以加参数值 
     * 比如
     * @Override 注解 首字母大写 表示重写父类方法
     * @Deprecated 废弃的 过时的 不建议使用的
     * @SuppressWarnings(value="unchecked")
     * 自定义注解:
     * @Target(value={ElementType.METHOD,ElementType.TYPE})
     * 可以看源文件  TYPE类型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
     * @Retention(RetentionPolicy.RUNTIME)自定义一般都选 runtime 
     * @Retention 保留  三个 范围  source源文件  class字节码文件 一般变压器用前面2个                     runtime 运行时(通过反射读取)一般自定义用它
     * 
     * 注解在哪使用?
     * 可以在package,class,mthod,field等 相等于加了辅助信息   我们可以通过反射机制实现对这些元数据的访问
     * @author Administrator
     *
     */
    public class TestAnnotation {
        @Override
        //注解 首字母大写 表示重写父类方法
        public String toString(){
            return "";
        }
        @Deprecated
        //废弃的 过时的 不建议使用的
        public static void test001(){
             System.out.println("ok");
        }
        public static void main(String[] args) {
            //虽然是不建议使用 但是可以使用
            test001();
        }
        @SuppressWarnings("all")
        //忽略 警告
        public static void test002(){
            
            
        }
    }

    如何自定义注解

    package com.bjsxt.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * 自定义注解
     * 元注解 :对注解进行解释
     * 注解的作用
     * 1.可以解释程序含义
     * 2.被其他程序使用
     * 注解的格式:
     * "@注解名" 还可以加参数值 
     * 比如
     * @SuppressWarnings(value="unchecked")
     * @Target  注解的作用范围(可以修饰包,    类。接口,枚举      方法   成员变量    局部变量    参数)
     * @Target(value={ElementType.METHOD,ElementType.TYPE})
     * 可以看源文件  TYPE类型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
     * @Retention(RetentionPolicy.RUNTIME)自定义一般都选 runtime 
     * @Retention 保留  三个 范围  source源文件  class字节码文件 一般变压器用前面2个                     runtime 运行时(通过反射读取)一般自定义用它
     * 
     * 注解在哪使用?
     * 可以在package,class,mthod,field等 相等于加了辅助信息   我们可以通过反射机制实现对这些元数据的访问
     * 
     * @author Administrator
     *
     */
    @Target(value={ElementType.METHOD,ElementType.TYPE})
    //可以看源文件  ElementType.METHOD方法    ElementType.TYPE型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
    @Retention(RetentionPolicy.RUNTIME)
    //自定义注解一般都选 runtime 
    public @interface MyAnnotation01 {
        //参数信息  参数类型 参数名
        //注解元素必须要有值 可以设置 默认返回值
        String studentName() default "";
        int age() default 0;
        int id() default -1;//-1表示不存在
        
        
        String[]schools()default{"清华","北大"};
                
    }
    package com.bjsxt.annotation;
    /**
     * 使用我们自定义的注解
     * @author Administrator
     *
     */
    @MyAnnotation01
    public class MyAnnotation01Test {
        @MyAnnotation01(age=19,studentName="老哥",id=1001,schools={"人大","北电"})
        public void test(){
            
        }
    }

    什么是ORM

    package com.bjsxt.annotation.orm;
    /**
     *  * ORM(Object Ralationship Mapping)
     * 关系型数据库
     * 类和表结构对应 属性和字段对应  对象和记录对应
     * @author Administrator
     *
     */
    
    @SxtTable("tb_student")
    public class SxtStudent {
        
        @SxtField(columName="id",type="int",length=10)
        private int id;
        @SxtField(columName="sname",type="varchar",length=10)
        private String studentName;
        @SxtField(columName="age",type="int",length=3)
        private int age;
        
        
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getStudentName() {
            return studentName;
        }
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    package com.bjsxt.annotation.orm;
    /**
     * 自定义注解table
     * 
     * 
     * ORM(Object Ralationship Mapping)
     * 关系型数据库
     * 类和表结构对应 属性和字段对应  对象和记录对应
     * 
     * 1.定义注解
     * 2.在类中使用注解
     * 3.解析注解
     */
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(value={ElementType.TYPE})
    //可以看源文件  ElementType.METHOD方法    ElementType.TYPE型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
    @Retention(RetentionPolicy.RUNTIME)
    //自定义注解一般都选 runtime 
    public @interface SxtTable {
        String value();
    
    }
    package com.bjsxt.annotation.orm;
    /**
     *  * ORM(Object Ralationship Mapping)
     * 关系型数据库
     * 类和表结构对应 属性和字段对应  对象和记录对应
     * 
     * 自定义注解 
     * field属性
     */
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(value={ElementType.FIELD})
    //可以看源文件  ElementType.METHOD方法    ElementType.TYPE型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
    @Retention(RetentionPolicy.RUNTIME)
    //自定义注解一般都选 runtime 
    public @interface SxtField {
        // 表的字段名
        String columName();
        String type();
        int length();
    
    }
    package com.bjsxt.annotation.orm;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Field;
    import java.util.Iterator;
    
    
    /**
     * 使用反射读取注解的信息 模拟处理注解信息的流程
     * @author Administrator
     *
     * * ORM(Object Ralationship Mapping)
     * 关系型数据库
     * 类和表结构对应 属性和字段对应  对象和记录对应
     */
    
    public class Demo03 {
        public static void main(String[] args) {
            try {
                //获得该包下这个类所有信息
                Class clazz=Class.forName("com.bjsxt.annotation.SxtStudent");
                //获得该类的所有注解
                Annotation[]annotation = clazz.getAnnotations();
                
                for (Annotation a: annotation ) {
                    System.out.println(a);
                    
                }
                //获取类的指定注解           根据注解名获取注解
                SxtTable st =(SxtTable) clazz.getAnnotation(SxtTable.class);    
                
                System.out.println(st.value());
                //获得类的属性的注解
                Field f = clazz.getDeclaredField("studentName");
                SxtField sxtField = f.getAnnotation(SxtField.class);
                System.out.println(sxtField.columName()+"--"+sxtField.type()+"--"+sxtField.length());
                //跟着获得的表名 字段信息 拼出DDl语句 然后,使用JDBC执行这个sql在数据库 生成先关的表
            } catch (Exception e) {
                
                e.printStackTrace();
            }
            
            
        }
    }
  • 相关阅读:
    Maven工程无异常 启动没有出现Starting ProtocolHandler的原因
    Unknown return value type [java.lang.Boolean]] with root cause
    解决java.lang.IllegalArgumentException: No converter found for return value of type
    jsp页面的地址
    HTTP Status 500
    Could not resolve placeholder 'IMAGE_SERVER_URL' in string value "${IMAGE_SERVER_URL}"
    yum出现Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile解决方法
    【程序人生】百度员工应聘腾讯职位,结果亮了!
    【开源组件】FastDFS集群搭建与实战
    【开源组件】FastDFS极速入门与安装
  • 原文地址:https://www.cnblogs.com/PoeticalJustice/p/7678316.html
Copyright © 2011-2022 走看看