import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
public class AnalysisAnnotation {
/**
* 一个java annotation的例子。总结两点
* 1,annotation是利用反射获得annotation信息,类不需要实例。所以本身与类的实例赋值没有任何关系
* 2,如果想用反射进行映射则需要用到invoke和将类实例后处理,注意invoke方法的参数问题
* @param args
*/
public static void main(String[] args) throws Exception {
try {
// 通过运行时反射API获得annotation信息
Class rt_class = Class.forName("Utility");
Object o = rt_class.newInstance();
Method[] methods = rt_class.getMethods();
boolean flag = rt_class.isAnnotationPresent(Description.class);
if (flag) {
Description description = (Description) rt_class
.getAnnotation(Description.class);
System.out.println("Utility's Description--->"
+ description.value());
for (Method method : methods) {
if (method.isAnnotationPresent(Author.class)) {
Author author = (Author) method
.getAnnotation(Author.class);
System.out.println("Utility's Author--->"
+ author.name() + " from " + author.group() + " is " + method.invoke(o));
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@Description(value = "这是一个工具类")
class Utility {
@Author(name="小刘",group="石器时代")
public String work(){
return "work!";
}
@Author(name="小张",group="石器时代")
public String work1(String s){
return "works!";
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@interface Author {
String name() default "defaultName";
String group() default "defaultGroup";
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@interface Description {
String value();
}
转载于:https://my.oschina.net/liuyuxiang/blog/511214