注解:是用于描述程序如何运行以及在什么阶段来运行,注解在实际开发中最大的功能是用于替换配置文件,注解是jdk1.5的新特性,可以通过反射来让注解具有功能。
1. 自定义注解
public @interface注解名{}
例:public @interface MyAnnotation{}
注解它的本质就是一个接口,这个接口继承Annotation接口。注解类反编译后:
public interface MyAnnotation extends java.lang.annotation.Annotation{}
2. 注解中的成员
注解本质上就是接口,接口中可以有属性方法,但是注解中的每一个方法其实是申明了一个配置属性,方法的名称就是参数的名称,返回值类型就是参数的类型,可以通过default来声明参数的默认值。
public @interface MyAnnotation {
int age() default 18;
String name();
String value();
}
注解参数可支持的数据类型:
① 所有基本类型
② String类型
③ Class类型
④ Enum类型
⑤ Annotation类型
⑥ 以上所有类型的一维数组
Annotation类型里面的参数只能用public或默认(default)这两个访问权修饰,如果只有一个参数成员,最好把参数名设置为value,这样使用注解的时候可以直接赋值,而不用写参数名。
例:
有一个注解:
public @interface MyAnn{
String value();
}
使用:@MyAnn(“abc”)
3. 注解的使用
使用注解的时候,如果注解中的属性没有默认值就必须要赋值:
public class Demo1 {
@MyAnnotation(name="aaa",value="bbb")
public void test1(){
}
}
4. 注解的反射
反射注解类
java.lang.reflect.AnnotatedElement:
l <T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。
l Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。
l Annotation[] getDeclaredAnnotations():得到自己身上的注解。
l boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。
Class、Method、Field、Constructor等实现了AnnotatedElement接口
5. 模拟@Test接口
① 定义注解类
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
② 使用注解
public class SomeDaoImpl {
@MyTest
public void add(){
System.out.println("add方法执行了。。。。");
}
public void update(){
System.out.println("update方法执行了。。。");
}
}
③ 模拟运行
public class Test1 {
public static void main(String[] args) {
Class clazz=SomeDaoImpl.class;
Method[] methods=clazz.getDeclaredMethods();
for(Method method:methods){
MyTest myTest=method.getAnnotation(MyTest.class);
if(myTest!=null){
try {
method.invoke(clazz.newInstance(), null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
6. 元注解:只能用在注解上的注解
@Retetion : 作用,改变自定义的注解的存活范围,取值:RetetionPolicy.RESOURCE\RetetionPolicy.CLASS\RetetionPolicy.RUNTIME
@Target:作用,指定注解能用在什么地方,取值:ElementType.TYPE\ ElementType.METHOD\ ElementType.FIELD\ ElementType.ANNOTATION_TYPE
@Documented:作用,一个注解类上有@Documented注解,那么使用了该注解的类的API文档上会出现这个注解的身影
@Inherited:作用,说明该注解可以被继承下去