1、Annotation 的由来
a.不直接影响程序代码的语义,annotation可以从源文件,class文件或者以在运行时反射的多种方式读取
b.类型标签javadoc
c.因为property,xml的配置文件比较繁琐
2、Annotation的定义方式
a.Class,Interface,enum,Annotation是同级别的类标识符
b.public
@interface AnnotationTest{}
//@+interface = annotation的定义哈
public @interface AnnotationTest2{
String value(); //默认构造方法
}
public @interface AnnotationTest3{
String value1();
}
public @interface AnnotationTest4{
String[] value();
}
public @interface AnnotationTest5{
String value1();
String value2();
}
3、Annotation的使用方式
a.@AnnotationTest 来使用就可以了;可以放在类,方法,属性上面;
b.@AnnotationTest2("test") == @AnnotationTest2(value="test");
c.@AnnotationTest3(value1="test3");
d.@AnnotationTest4({"test1","test2"}); == @AnnotationTest4(
value=({"test1","test2"})
e.@AnnotationTest5(value1="hello",value2="world")
4、jdk5.0以后自带的Annotation详解
a.Override (重写)
b.Deprecated (抛弃的,
已过时的)
c.SuppressWarnings(压制警告,屏蔽警告)
SuppressWarnings("unchecked"); //屏蔽一个警告
SuppressWarnings({"
unchecked","
deprecation"})//屏蔽[多个]警告 注意
{key1,key2
}的使用,以数组的形式存放
有哪些常用的警告类型呢?
-》unchecked,deprecration,可自定义
5、Annotation的高级特性
一、怎么来处理Annotation
a.告知编译程序如何处理@
Retention(重要)
java.lang.annotation.Retention型态可以在您定自定义Annotation型态时,指示编译程序应该如何对待你的自定义的Annotation型态-->
预设上编译程序会将Annotation信息留在[.class默认]档案中,但不会被java虚礼机读取,
而仅用于编译程序或工具程序运行时的提示信息(目的)
1)本身就是一个 注释类型 Retention
2)用一个: RetentionPolicy value();属性 见jdk api
3)
RetentionPolicy是什么呢?它是一个枚举类型的注释保留策略:
CLASS默认(编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释)、
RUNTIME(编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取)、
SOURCE(编译器要丢弃的注释)
4).例子
@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
@Retention(value=SOURCE) == @Retention(RetentionPolicy.SOURCE) //提供了一个策略类
//就可以看出来,他主要就是压制警告,所以没有必要保存到class文件里面去
public @interface
SuppressWarnings{。。。}
5).RUNTIME时通过反射来得到Annotation相关的信息
6).
AnnotatedElement 就是提供反射处理annotation的接口,
Class,constructor,Field,Method,Package都实现了这个接口,然后我们在反射的时候可以先得到Class,Constructor,Method等对象再通过里面继承的
,getAnnotations,getDeclaredAnnotations,isAnnotationPresent方法画得到类,构造方法,方法,属性等前面的Annotation流程信息。
b.限定Annotation的使用对象-@
Target(重要)
1).注释类型
Target,方法:ElementType[] value
2).枚举
ElementType:PACKAGE[包声明],TYPE[类、接口(包括注释类型)或枚举声明],ANNOTATION_TYPE[注释类型==annotation类里面可以定义],CONSTRUCTOR[构造方法],METHOD[方法],FIELD[字段声明(包括枚举常量)] ,LOCAL_VARIABLE[局部变量声明] ,PARAMETER[参数声明]
3).实例
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.TYPE,
ElementType.METHOD,ELEMENTType.FIELD})
public @interface AnnotationTest6{
String value();
}
c.子类是否继承父类的Annotation-
Inherited 1).注释类型 Inherited 声明的Annotation,此元注释仅促成从超类继承注释;对已实现接口的注释无效
对接口起作用
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Inherited 2).使用:如果我们在新建Annotation对象事,如果
声明了Inherited就会自动继承,反知则不继承
3).实例:
@Retention(RetentionPolicy.RUNTIME)
@
Inherited
public @interface AnnotationTest6{String value();}
@
AnnotationTest6("haha")
public class Parent{}
public class Child extends Parent{}
然后通过反射去查Child的所有Annotation
d.利用反射得到Annotation信息[@Retention(value=RUNTIME)]
1)用上面的实例:
AnnotationTest5
2)真正解析代码:
public Class MyTest{
@AnnotationTest5(value1="hello",value2="world")
public void output(){
System.out.println("test annotation");
}
}
public class MyReflection{
public static void main(String args[]){
MyTest t = new MyTest();
Class<MyTest> c = MyTest.class;
Class<
AnnotationTest5> a = AnnotationTest5.class;
Method m = c.getMethod("output",new Class[]{});
if(m.isAnnotationPresent(a)){
m.invoke(t,new Object[]{});
//Annotation a1 = m.getAnnotation(a);
MyAnnotationTest5 t5 =
m.getAnnotation(a);
System.out.println(t5.value1);
System.out.println(t5.value2);
}
Annotation[] ans = m.
getAnnotations();
for(Annotation an : ans){
System.out.println(an.annotationType().getName()); //但这就要看Annotation选择的那种生成策略:SOURCE,CLASS,RUNTIME[SuppressWarnings就不会显示出来]
}
}
}
6、应用
a.javadoc
1)注释类型
Documented 2)实例:一般我们产生javadoc的时候,没有把我们自定义的annotation显示显示出来,我们要怎么把我们写的annotation信息也显示在javadoc里面呢?
@Documented //这一句就是在生成javadoc的时候,如果遇到下面定义的annotation就要显示出来
public @interface DocumentedAnnotation{
String value() default "test";
}
public class DocumentedTest{
/*
* 测试生成javadoc
*/
@
DocumentedAnnotation(value="welcome")
public void testJavadoc(){
System.out.println("哈哈");
}
}
点击myeclipse里面的project-->generate javadoc->设置 就可以生成javadoc了
名称: ♪4C.ESL | .↗Evon
口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
mail: 联系我