注解
-
注解的使用 Annotation jdk5.0新特性
-
注解(Annotation)其实就是代码中的特殊标记,这些标记可以在编译,类加载,运行时被读取
程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息 -
JavaSE中,注解的使用主要是:标记过时的功能,忽略警告等,JavaEE中注解较为重要
用于配置程序的任何切面,代替JavaEE(JavaWeb)中的xml文件配置问题
- 框架 = 注解 + 反射机制 + 设计模式
如何自定义注解
- 参照@SupperssWarnings定义
- 注解声明:@interface
- 内部定义成员,同城使用value表示
- 可以指定成员的默认值,使用default定义
- 自定义注解没有成员,表明是一个标识作用
- 如果注解有成员,使用时必须指明成员值
public @interface MyAnnotation {
String value() default "注解";
}
- 自定义注解必须配上注解的信息处理流程(使用反射)才有意义
- 自定义注解通过都会指明两个元注解:
@Retention
、@Target
元注解
SOURCE:反编译时看不到注解信息
CLASS:反编译时注解信息同时反编译
简单来说就是注解信息会不会生成class文件
/*
* jdk 提供的四种元注解
* 元注解:对现有的注解进行解释说明的注解
* Retention:指定所修饰的Annotation的生命周期:SOURCE\CLASS(默认行为)\RUNTIME
* 只有声明为RUNTIME生命周期的注解,才能通过反射获取
* Target:用于指定被修饰的Annotation能用于修饰哪些程序元素
*
* Documented:表示修饰的注解在被javadoc解析是,将被保留
* Inherited:被他修饰的Annotation将具有继承行
*/
@Repeatable(MyAnnotations.class)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
String value() default "注解";
}
注解新特性 jdk8.0
可重复注解
/* jdk8.0 注解新特性:
*
* 可重复注解
* 在MyAnnotation上声明 @Repeatable,成员值为 MyAnnotations.class
* MyAnnotation的Target和Retention等元注解与MyAnnotations相同。
*
* 类型注解
* ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明。)
* ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
*/
public class Annotation {
@MyAnnotation(value = "注解")
@MyAnnotation(value = "多重注解")
@Test
public void test(){
System.out.println("注解测试");
}
}
MyAnnotation
@Repeatable(MyAnnotations.class)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
String value() default "注解";
}
MyAnnotations
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotations {
MyAnnotation[] value();
}