zoukankan      html  css  js  c++  java
  • 注解

    注解

    注解即是元数据,就是源代码的元数据.

    在Java语法中,使用@符号作为开头,后面紧跟注解名,用作于类,接口,方法,字段之上>例:@Override 复写父类方法注解

    Java三大内置注解

    @Override ;      表示当前的方法定义将覆盖父类中的方法,如果出现错误,编辑器报错.

    @Deprecated; 如果使用次注解,编译器会出现警告信息(标示已过时)

    @SuppressWarning();       抑制编译器的警告信息 unchecked表示:执行了未检查的转换

    元注解

    自定义注解的时候使用的注解.(修饰其他注解的定义)

    Java定义的4个元注解

    @Targt

    该元注解说明了Annotation(注解)所修饰的对象范围.(被描述的注解可以用在什么地方).

    取值范围有:

    类型                                                           用途

    CONSTRUCTOR                                   用于描述构造器

    FIELD                                                     用于描述字段

    LOCAL_VARIABLE                               用于描述局部变量    

    METHOD                                              用于描述方法

    PACKAGE                                              用于描述包

    PARAMETER                                        用于描述参数

    TYPE                                               用于描述类、接口(包括注解类型) 或enum声明

    例:(该注解只能在方法中使用)

    @Target(ElementType.METHOD)

    public @interface myAnnotation{

    }

    @Retentoin

    该元注解定义了Annotation(注解)被保留的时间长短,表示需要在什么级别保存该注释信息,用于描述注解的生命周期(什么范围内有效);指定该注解可以使用反射读取.

    取值范围有:

    类型                                               说明

    SOURCE                    在源代码中有效(仅出现在源代码中,而被编译器丢弃)

    CLASS                        在class文件中有效,(被编译在Class文件中) 类加载

    RUNTIME                 在运行时有效(编译在Class文件中)

    例:

    /***

     * 字段注解接口

     */

    @Target(value = {ElementType.FIELD})//注解可以被添加在属性上

    @Retention(value = RetentionPolicy.RUNTIME)

    //注解保存在JVM运行时刻,能够在运行时刻通过反射API来获取到注解的信息

    public @interface Column {

        String name();//注解的name属性

    }

    @Documented

    将注解包含在javadoc中,可以使用JavaDoc提取为文档

    @Inherited

    指定该修饰的注解具有继承性

    自定义注解

    格式:

    public @interface 注解名{

    //成员变量:注解中以无参的方法来声明成员变量

    返回值类型 方法名();

    返回值类型 方法名()  default 默认值;

    }

    规则:

    修饰符中只能是public 或 默认(default)

    参数成员只能用基本数据类型和String,Enum,Class,annotations及这些类型的数组

    如果只有一个参数成员,最好将名称设为”value”

    注解元素必须有确定的值,可以在注解中定义默认值,也可以使用直接时指定,非基本类型的值不可为null,常使用空字符串或0作默认值

    在表现一个元素存在或缺失的状态时,定义一下特殊值来表示,如空字符串或负值.

    自定义注解的使用:

    自定义注解:

    import java.lang.annotation.*;
    
    @Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    public @interface Table {
    
        String value();
    }

    测试实体类

    @Table("city")
    public class CityEntity {
    
        @Table("idTable")
        public Integer id;
        @Table("nameTable")
        public String name;
    
        @Table("getIdMethod")
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    模拟获取类、方法、字段注解信息内容

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class SqlUtils {
    
        public static String getSelectSql(Object obj) throws NoSuchMethodException {
            StringBuilder sb = new StringBuilder();
            sb.append("SELECT * FROM ");
            Class<?> aClass = obj.getClass();
            //判断是否加了注解
            if(aClass.isAnnotationPresent(Table.class)){
                //获取类注解信息
                Table annotation = aClass.getAnnotation(Table.class);
                //调用方法
                sb.append(annotation.value());
            }
            //获取字段注解信息
            Field[] fields = obj.getClass().getFields();
            for (Field field : fields) {
                sb.append("------");
                Table annotation = field.getAnnotation(Table.class);
                sb.append(annotation.value());
            }
            //获取方法注解信息
            Method getId = obj.getClass().getMethod("getId", null);
            Table annotation = getId.getAnnotation(Table.class);
            sb.append("------");
            sb.append(annotation.value());
            return sb.toString();
        }
    }

    测试结果

    public class test {
    
        public static void main(String args[]) throws NoSuchMethodException {
            CityEntity cityEntity = new CityEntity();
            String selectSql = SqlUtils.getSelectSql(cityEntity);
            System.out.println(selectSql);
        }
    }
    
    //打印结果:
    SELECT * FROM city------idTable------nameTable------getIdMethod

  • 相关阅读:
    【转】adb push&pull bug --- Permission denied----不错
    【转】notepad++设置字体和字体大小
    【转】 Ubuntu下配置USB转串口及串口工具配置--不错
    【转】 ubuntu下fastboot找不到devices
    【转】ubuntu下安装及设置FTP服务器!!
    【转】vsftp 遇到错误 500 OOPS: vsftpd: refusing to run with writable root inside chroot()--不错
    【转】ubuntu安装ftp服务器
    android网址
    【转】Linux下Android ADB驱动安装详解
    【转】(总结)Linux下su与su -命令的本质区别
  • 原文地址:https://www.cnblogs.com/it-xiaoBai/p/8081489.html
Copyright © 2011-2022 走看看