注解
* 注解被大量应用与反射中,可以辅助反射机制做更多灵活的操作。
* 后期使用的框架基本都是使用注解进行配置的。
*
* 在注解上我们有两个常用的注解用来说明当前注解的相关特性:
* @Target:用于说明我们定义的注解可以被应用到哪里。
* 该注解可以传递的参数为ElementType类型,用来表示可标注的位置。
* 常见的有:
* ElementType.TYPE:在类上用
* ElementType.METHOD:在方法上
* ElementType.FIELD:在属性上用
* ...
* 如果不指定@Target,则当前注解可以被应用在任何注解可使用的位置上。
*
* @Retention:当前注解的保留级别,有三个可选值
* RetentionPolicy.SOURCE:当前注解仅保留在源代码中,编译后的字节码文件中没有该注解
* RetentionPolicy.CLASS:保留到编译后的字节码文件中,但是反射机制不可访问
* RetentionPolicy.RUNTIME:保留到字节码中且反射机制可以访问
* 不指定时,默认保留级别为CLASS
/*
注解中定义参数的语法:
类型 参数名() [default 默认值]; 注:[]中的内容可写,可不写。
如果当前注解只有一个参数时,那么参数名应当叫value.
此时当我们在外面使用该注解时,可以使用:
@AutoRunMethod(3)
进行传参。此时注解中value的值为3
如果该参数名不叫value,例如,定义时如下:
public @interface AutoRunMethod{
int num();
}
此时当我们在外面使用该注解时,可以使用:
@AutoRunMethod(num=3) 语法要求:传参时格式为:参数名=参数值
进行传参。此时注解中num的值为3
只有参数名叫value时,传递参数才可以将参数名忽略。
以上特性仅限于只有一个参数时。
当有多个参数时,例如,定义时如下:
public @interface AutoRunMethod{
int value();
String name();
}
使用注解传递参数时,参数名都不可以忽略,必须写为name=value的格式,且顺序无所谓。
例如:
@AutoRunMethod(value=1,name="张三")
@AutoRunMethod(name="张三",value=1)
以上都正确
参数可以使用default指定默认值,那么在使用注解时。可以不指定该参数的值,此时使用默认值
public @interface AutoRunMethod{
int value() default 1;
}
使用该注解时:
@AutoRunMethod(3)
此时value的值为3
@AutoRunMethod
此时value的值为1(默认值)
*/
//为注解定义一个int型的参数value
/**
* 反射机制访问注解
*/
public class ReflectDemo7 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("reflect.Person");
/*
Class,Method等常用的反射对象都提供了一个方法:
boolean isAnnotationPresent(Class cls)
用于判断是否被参数指定的注解标注过(参数为注解的类对象)
*/
//cls所表示的类Person是否被注解@AutoRunClass标注过
boolean flag = cls.isAnnotationPresent(AutoRunClass.class);
if(flag){
System.out.println("被标注了!");
}else{
System.out.println("没有被标注!");
}
}
}
/**
* 获取注解中的参数
*/
public class ReflectDemo8 {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("reflect.Person");
Method method = cls.getMethod("sayHello");
if(method.isAnnotationPresent(AutoRunMethod.class)){
//获取该方法上的注解@AutoRunMethod
AutoRunMethod arm = method.getAnnotation(AutoRunMethod.class);
//通过注解对象获取value参数的值
int value = arm.value();
System.out.println(value);
}
}
}