疯狂-注解
2017-08-27 23:44:29 47 举报
AI智能生成
java自定义注解还是很有用的,能方便开发
作者其他创作
大纲/内容
基本Annotation
5个基本的Annotation:
@Override
@Deprecated
@SuppressWarnings
@SafeVarargs : 1.7新增
@FunctionalInterface : 1.8新增
@Override
@Deprecated
@SuppressWarnings
@SafeVarargs : 1.7新增
@FunctionalInterface : 1.8新增
限定重写父类方法:@Override
强制子类必须覆盖父类的方法。
@Override告诉编译器,检查父类必须包含一个被该方法重写的方法
当子类拥有和父类完全一样的方法时,默认是overrid(覆盖,重写)
标记已过时:@Deprecated
表明该方法已经过时
抑制编译器警告:@SuppressWarnings
取消指定的编译器警告
需要指定值
java 7的“堆污染”警告与@SafeVarargs
@SafeVarargs修饰引发该警告的方法或构造器
@SuppressWarnings("unchecked")修饰
@SuppressWarnings("unchecked")修饰
java8的函数式接口与@FunctionalInterface
@FunctionalInterface指定某个接口必须是函数式接口
JDK的元Annotation
使用@Retention
value的成员变量值可以是以下三种:
RetentionPolicy.CLASS:
记录在class文件中,运行java程序时,JVM不可获取annotation信息
RetentionPolicy.RUNTIME:
记录在class文件中,运行java程序时,JVM可以获取annotation信息
RetentionPolicy.SOURCE:
annotation只保留在源码中,编译器直接丢弃这种Annotation
RetentionPolicy.CLASS:
记录在class文件中,运行java程序时,JVM不可获取annotation信息
RetentionPolicy.RUNTIME:
记录在class文件中,运行java程序时,JVM可以获取annotation信息
RetentionPolicy.SOURCE:
annotation只保留在源码中,编译器直接丢弃这种Annotation
@Retention(value = RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.SOURCE) 当Annotation的成员变量名字为value时,
可以直接指定该值,不需要 name=value的形式
@Retention(RetentionPolicy.SOURCE) 当Annotation的成员变量名字为value时,
可以直接指定该值,不需要 name=value的形式
@Target
指定Annotation能用于修饰哪些程序单元
value指定的值
ElementType.ANNOTATION_TYPE : 只能修饰Annotation
ElementType.CONSTRUCTOR : 只能修饰构造器
ElementType.FIELD : 只能修饰成员变量
ElementType.LOCAL_VARIABLE : 只能修饰局部变量
ElementType.METHOD : 只能修饰方法
ElementType.PACKAGE : 只能修饰包定义
ElementType.PARAMETER : 修饰参数
ElementType.TYPE : 修饰类、接口或枚举定义
value指定的值
ElementType.ANNOTATION_TYPE : 只能修饰Annotation
ElementType.CONSTRUCTOR : 只能修饰构造器
ElementType.FIELD : 只能修饰成员变量
ElementType.LOCAL_VARIABLE : 只能修饰局部变量
ElementType.METHOD : 只能修饰方法
ElementType.PACKAGE : 只能修饰包定义
ElementType.PARAMETER : 修饰参数
ElementType.TYPE : 修饰类、接口或枚举定义
@Documented
修饰的Annotation类将被javadoc工具提取成文档
@Inherited
修饰的Annotation具有继承性,父类使用了被@Inherited修饰的annotation,则子类也会具有该annotation修饰
自定义Annotation
定义Annotation
使用 @interface关键字自定义annotation
public @interface MyAnnotation {
String name(); 有一个name的成员变量
int age() default 20; 缺省值
}
String name(); 有一个name的成员变量
int age() default 20; 缺省值
}
提取Annotation信息
<A extends Annotation> A getAnnotation(Class<A> annotationClass);
返回该元素上存在的、指定类型的注解,如果不存在,返回null;
<A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass);
java8新增,获取直接修饰该元素,且指定类型的Annotation,如果不存在,返回null
Annotation[] getAnnotations();
返回该元素上存在的所有注解
Annotation[] getDeclaredAnnotations();
返回元素上存在的所有注解
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
是否存在指定类型的注解,存在true,不存在false
<A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass);
<A extends Annotation> A[] getDeclaredAnnotatinosByType(Class<A> annotationClass)
返回该元素上存在的、指定类型的注解,如果不存在,返回null;
<A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass);
java8新增,获取直接修饰该元素,且指定类型的Annotation,如果不存在,返回null
Annotation[] getAnnotations();
返回该元素上存在的所有注解
Annotation[] getDeclaredAnnotations();
返回元素上存在的所有注解
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
是否存在指定类型的注解,存在true,不存在false
<A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass);
<A extends Annotation> A[] getDeclaredAnnotatinosByType(Class<A> annotationClass)
java8新增的重复注解
开发重复注解需要使用@Repeatable修饰
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FkTags {
FkTag[] value();
}
@Repeatable(FkTags.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FkTags {
FkTag[] value();
}
@Target(ElementType.TYPE)
public @interface FkTags {
FkTag[] value();
}
@Repeatable(FkTags.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FkTags {
FkTag[] value();
}
java8新增的Type Annotation
新增两个(Type Annotation)(类型注解)
ElementType.TYPE_PARAMETER
ElementType.TYPE_USE
ElementType.TYPE_PARAMETER
ElementType.TYPE_USE
Type Annotation 可以用在 创建对象、类型转换、使用implements实现接口、使用throws声明抛出异常
编译时处理Annotation
java8新增的重复注解
javac -processor Annotation处理器
RountEnvironment:
getElementsAnnotatedWith() :
返回Annotation处理的程序单元,有ElementKind.CLASS
ElementKind.FIELD....
getElementsAnnotatedWith() :
返回Annotation处理的程序单元,有ElementKind.CLASS
ElementKind.FIELD....
Element:
getEnclosedElements() : 获取定义的所有程序单元,包含变量、方法、构造器、内部类
getEnclosedElements() : 获取定义的所有程序单元,包含变量、方法、构造器、内部类
0 条评论
下一页