package Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//Target定义了直接可以注释在方法体还是类上面field,等上面
@Target({ElementType.METHOD,ElementType.TYPE})
//Inherited 注释了改方法或类的子类会继承该接口
@Inherited
//RUNTIME时可以通过反射获取到注解中的方法
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//value方法 在声明是value=可以省略 若数组值只有一个 也可以省略{}
public String[] value();
//当没有default时,声明注解时必须要指定value1的值
public String value1() default "value1";
}
package Annotation;
@MyAnnotation(value={"myAnnotation1","myAnnotation2"},value1="myvalue")
public class MyMain {
@SuppressWarnings("unchecked")
@MyAnnotation("myAnnotation")
public void method() {
System.out.println("do local method");
}
}
package Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class MyReflect {
/**
* Annotation反射方法调用
* @param args
* @throws NoSuchMethodException
* @throws SecurityException
*/
public static void main(String[] args) throws Exception {
Class<MyMain> ClassType=MyMain.class;
Constructor<MyMain> c=ClassType.getConstructor();
MyMain myMain=c.newInstance();
// 前面两句相当于 MyMain myMain=ClassType.newInstance();
Method m=ClassType.getMethod("method");
if(m.isAnnotationPresent(MyAnnotation.class))
{
MyAnnotation ma=m.getAnnotation(MyAnnotation.class);
System.out.println(ma.value()[0]);
System.out.println(ma.value1());
myMain.method();
}else{
System.out.println("未找到对应的注解");
}
}
}
运行结果:
myAnnotation
value1
do local method