zoukankan      html  css  js  c++  java
  • Java Annotation 刷课笔记(一)

    1.什么是注解?

    1.1.Annotation是从JDK5.0引入的新技术

    1.2.Annotation的作用:

    • 不是程序本身,可以对程序作出解释(这一点,和注释没什么区别)
    • 可以被其他程序(比如编译器)读取,注解信息处理流程,是注解和注解的重大区别,如果没有注解信息的处理流程,则注解毫无意义

    1.3.内置注解

    @Override 重载

    @Deprecated  不建议使用

    @SupressWarning  去除警告信息

    2.自定义注解

    2.1.自定义注解的前提是注解上要加入两个元注解

    2.1.1.Target 注解目标是谁

      package   包

      type          类,接口,枚举,Annotation

      constructor 构造器

      field    描述域

      method    描述方法

      local_variable   局部变量

    2.1.2 Retention 需要在什么级别保存注解信息,用于描述注释的声明周期(是CLASS,SOURCE还是RUNTIME)

      source  在源文件中保留

      class   在class文件中保留

      runtime  在运行时可以被反射读取(这个用的比较多)

    2.1.3 可以写类似方法的参数

    String stu() default "";

    3.利用反射机制读取注解信息

    示例:使用反射写一个程序来创建tb_student表

    studnet类

    package littlepage.annotation.demo01;
    
    @AnnoTable("tb_student")
    public class Student {
        @AnnoField(columnName = "id",type = "int",length = 10)
        private int id;
        @AnnoField(columnName = "name",type = "varchar",length = 255)
        private String name;
        @AnnoField(columnName = "field",type = "varchar",length = 10)
        private int age;
    }

    AnnoTable Annotation

    package littlepage.annotation.demo01;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface AnnoTable {
        String value();
    }

    AnnoField Annotation

    package littlepage.annotation.demo01;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AnnoField {
        String columnName();
        String type();
        int length();
    }

    转换类

    package littlepage.annotation.demo01;
    
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Field;
    
    public class Demo01 {
        public static void toSQL(Class<?> clazz) {
            //拿到类名上的属性值
            AnnoTable table = (AnnoTable) clazz.getAnnotation(AnnoTable.class);
            String tableName = table.value();
            //拼SQL
            StringBuilder sb = new StringBuilder();
            sb.append("create table ").append(tableName).append("(
    ");
            //拿到各个Field
            Field[] fields = clazz.getDeclaredFields();
            String fieldString;
            for (Field field : fields) {
                Annotation[] annotations=field.getAnnotations();
                for (Annotation annotation:annotations) {
                    String annotationString=annotation.toString();
                    String columnName=annotationString.substring(annotationString.indexOf("columnName=")+11,annotationString.indexOf(", type"));
                    String typeName=annotationString.substring(annotationString.indexOf("type=")+5,annotationString.indexOf(", length"));
                    String length=annotationString.substring(annotationString.indexOf("length=")+7,annotationString.indexOf(")"));
                    sb.append(columnName+" "+typeName+"("+length+"),
    ");
                }
            }
            sb.replace(sb.length()-1,sb.length(),"
    );");
            System.out.println(sb);
        }
    
        public static void main(String[] args) {
            toSQL(Student.class);
        }
    }
  • 相关阅读:
    分享两个你可能不知道的Java小秘密
    一次ssl的手动实现——加密算法的简单扫荡
    TCP/IP中最高大上的链路层简介(二)
    与TCP/IP协议的初次见面(一)
    高并发下的九死一生,一个不小心就掉入万丈深渊
    杂谈---一个项目经理的自我反省
    浅谈程序员的行业选择---程序人生
    杂谈---大压力下的工作
    一个有意思的需求——中文匹配度
    杂谈---一个人的两种心理
  • 原文地址:https://www.cnblogs.com/littlepage/p/11235595.html
Copyright © 2011-2022 走看看