一、注解的定义:
Java注解又称Java标注,是在 JDK5 时引入的新特性。注解可以在程序执行时可以被程序读取。
public @interface AutoRunClass{
}
二、注解的应用
注解被大量应用与反射中,可以辅助反射机制做更多灵活的操作。后期使用的框架基本都是使用注解进行配置的。
注解中有两个常用的注解可以说明当前注解的相关特性:
<1 @Target:用于说明我们定义的注解可以被应用到哪里。
该注解可以传递的参数为ElementType类型,用来表示可标注的位置。
常见的有:
ElementType.TYPE:在类上用
ElementType.METHOD:在方法上
ElementType.FIELD:在属性上用
...
如果不指定@Target,则当前注解可以被应用在任何注解可使用的位置上。<2 @Retention:当前注解的保留级别,有三个可选值
RetentionPolicy.SOURCE:当前注解仅保留在源代码中,编译后的字节码文件中没有该注解
RetentionPolicy.CLASS:保留到编译后的字节码文件中,但是反射机制不可访问
RetentionPolicy.RUNTIME:保留到字节码中且反射机制可以访问
不指定时,默认保留级别为CLASS
三、注解中定义参数
/*
注解中定义参数的语法:
类型 参数名() [default 默认值]; []中的内容可写,可不写
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunClass{
}
------------------------------------------------------------
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunMethod{
//如果当前注解只有一个参数,那么参数名应当叫value
//可以在注解中定义多个参数,在传参时,参数名不能忽略,传参顺序没有要求
int value() default 1;
String name();
}
@AutoRunClass
public class Student{
private String name="张三";
private int age=18;
public Student(){}
public Student(String name,int age){
this.name = name;
this.age = age;
}
@AutoRunMethod(value=2,name="张三") //@AutoRunMethod注解中的value会返回2
public void sayHello(){
System.out.priintln(name+"hello");
}
@AutoRunMethod(name = "李四") //value的默认值为1
public void sayHi(){
System.out.println(name+":hi!");
}
}
四、在类中加入反射机制实现注解
public class ReflectDemo{
public static void main(String[] args) throws Exception{
Class cls = Class.forName("reflect.Student");
Method method = cls.getDeclaredMethod("sayHello");
//判断cls所表示的Student是否被注解@AutoRunClass标注
if(cls.isAnnotationPresent(AutoRunClass.class)){
//判断cls所表示的Student是否被注解@AutoRunMethod标注
if(method.isAnnotationPresent(AutoRunMethod.class)){
//获取该方法上的注解@AutoRunMethod
AutoRunMethod arm = method.getAnnotation(AutoRunnMethod.class);
//通过注解对象获取value参数的值
int value = arm.value();
}
}
}
}