注解(Annotation)就像一个标签,用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。
JDK预置注解包括:
@Deprecated,即将废弃的标记;
@Override,表示当前的方法定义将覆盖超类中的方法;
@SuppressWarnings,阻止警告的意思
@SafeVarargs,参数安全类型注解
@FunctionalInterface,函数式接口注解
元注解
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。
@Retention,注解的存活时间,取值如下:
- RetentionPolicy.SOURCE,注解只在源码阶段保留,将被编译器丢弃;
- RetentionPolicy.CLASS,注解保留到编译期间,将被VM丢弃;
- RetentionPolicy.RUNTIME,注解保留到运行期间,因此可以通过反射机制读取注解的信息;
@Target,限定注解应用的场景,注解可以加在包、类,属性、方法,方法的参数以及局部变量上,取值如下:
- ElementType.ANNOTATION_TYPE,可以给一个注解进行注解
- ElementType.CONSTRUCTOR,可以给构造方法进行注解
- ElementType.FIELD,可以给属性进行注解
- ElementType.LOCAL_VARIABLE,可以给局部变量进行注解
- ElementType.METHOD,可以给方法进行注解
- ElementType.PACKAGE,可以给一个包进行注解
- ElementType.PARAMETER,可以给一个方法内的参数进行注解
- ElementType.TYPE,可以给一个类型进行注解,比如类、接口、枚举
@Repeatable,注解可以被多次应用
@Inherited,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
@Documented,将注解中的元素包含到Javadoc中;
获取注解信息
/** * 获取实体类上注解中国的所有字段名 * * @param type * @return java.util.List<java.lang.String> * @author CYH * @date 2020/5/27 0027 11:35 **/ public static <T> List<String> getEntityFieldList(Class<T> type) { try { List<String> list = new ArrayList<>(); Field[] fields = type.getDeclaredFields(); for (Field field : fields) { list.add(field.getAnnotation(FieldColumn.class).value()); } return list; } catch (Exception e) { e.printStackTrace(); return null; } }
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FieldColumn { public String value(); }