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