反射取得Annotation信息
Annotaion这项技术的编写带来了新的模型,而后经过了长时间的发展,Annotaion技术已经得到了非常广泛的应用,并且在所想开发之中都会存在。
获取Annotation信息
在进行类或者方法定义的时候都可以使用一系列的Annotation进行申明,如果要想获取这些Annotation的信息,就可以通过反射来完成。在java.lang
.reflect里面有一个AccessibleObject类,这个类中提供有获取Annotation的方法:
- 获取全部Annotaion:public Annotation[] getAnnotations()
- 获取指定Annotioan:public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
范例:定义一个接口,并在接口上使用Annotation
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class AnnotationDemo {
public static void main(String[] args) {
//获取接口上的Annotation信息
Annotation[] annotation = IMessage1.class.getAnnotations();
for(Annotation annotation1 : annotation){
System.out.println(annotation1);
}
System.out.println("-------------------获取MessageImpl上的Annotation信息-------------------------------");
//获取MessageImpl上的Annotation信息
Annotation[] annotations = MessageImpl.class.getAnnotations();
for(Annotation annotation1 : annotations){ //无法在程序执行时获取
System.out.println(annotation1);
}
System.out.println("----------------------send()方法上的Annotation信息----------------------------");
try {
Method method = MessageImpl.class.getDeclaredMethod("send",String.class);
Annotation[] annotation2 = method.getAnnotations();
for(Annotation annotation1 : annotation2){ //无法在程序执行时获取
System.out.println(annotation);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
@FunctionalInterface
@Deprecated
interface IMessage1{ //有两个Annotation
public void send(String msg);
}
@SuppressWarnings("serial")
class MessageImpl implements IMessage1, Serializable{
@Override
public void send(String msg){
System.out.println("【消息发送】"+msg);
}
}
@java.lang.FunctionalInterface()
@java.lang.Deprecated(forRemoval=false, since="")
-------------------获取MessageImpl上的Annotation信息-------------------------------
----------------------send()方法上的Annotation信息----------------------------
不同的Annotation有它的存在范围,下面对比两个Annotation。
@FunctionalInterface(运行时) | @SuppressWarnings(源代码) |
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {} | @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings { |
发现@“FunctionalInterface”是在运行时生效的Annotation,所以程序执行时可以获取此Annotation。而“@SuppressWarnings”是在源代码编写的时候有效。而在RetentionPolicy枚举类中还有一个class定义,指的是在类定义的时候生效。