JavaEE-Java开发框架的基础-注解机制
概述
Annotation(注解)工作方式:
从java1.5以后,jdk提供了注解开发,开发者可以自定义注解。Annotation并不影响代码的语义,但是它的工作方式常被用来开发程序工具或者类库,它反过来对正在运行的程序语义有所影响
举例: @override
override属于标识性注解
常见标识性注解
@Deprecated:过期的方法,不建议使用的
@SuppressWarning:消除警告(开发工具标志了黄线则为警告)
自定义注解
public @interface MyAnn {
//定义注解的属性,必须要加上()
String value();
}
@MyAnn(value = "hello")
public class AnnTest {
@interface代表注解
注解中可以设置值,在程序运行时配合使用
所有带@的接口都继承自
@Retention
@Retention是作用在注解上的注解,指明被注解的注解有效期
有三个RetentionPolicy类型的值可以设置
ClASS:注解指定的值至保留在类文件
RUNTIME:有效期包含通过反射被调用时
SOURCE:只保留在源代码
如:
@Retention(RetentionPolicy.RUNTIME )
public @interface testAnno {
}
@Target
主要标注在注解上,表示被标注的注解可以标注在哪些域上
@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD})
public @interface Anndemo {
//定义注解属性
String [] value();
}
以上表示只标注在方法上
@Target支持添加的类型
注解的值类型(是个枚举类型)
枚举中有以下项
AnnotatedElement接口
所有的域(类,方法,属性,包等)都实现了这个接口
接口中定义了获得注解的方法
注解应用实例
自定义注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME )
public @interface testAnno {
String value();
}
自定义注解所添加的方法:
public class Caculate {
@testAnno(value = "相加的结果为")
public int add(int a, int b ){
return a+b ;
}
}
反射调用方法,获得注解值,进而影响程序:
import java.lang.reflect.Method;
public class testReflect {
public static void main(String[] args) throws Exception {
//创建Caculate类对象
Class<?> clazz = Caculate.class ;
//通过类对象获得实例
Object obj = clazz.newInstance();
//获得方法
Method method = clazz.getDeclaredMethod("add", int.class, int.class);
//判断是否存在注解
boolean isA = method.isAnnotationPresent(testAnno.class) ;
if(isA){
//获得注解
testAnno an = method.getAnnotation(testAnno.class) ;
//获得注解的值
String val = an.value();
//反射调用add方法
Object result = method.invoke(obj,new Object[]{1,2}) ;
//结合注解的值
System.out.println(val+result);
}
}
}