1. @Target指定注解针对的地方
ElementType:
ElementType.TYPE 针对类、接口
ElementType.FIELD 针对成员变量
ElementType.METHOD 针对成员方法
ElementType.PARAMETER 针对方法参数
ElementType.CONSTRUCTOR 针对构造器
ElementType.PACKAGE 针对包
ElementType.ANNOTATION_TYPE 针对注解
2. @Retention指定注解的保留域
RetentionPolicy:
RetentionPolicy.SOURCE 源代码级别,由编译器处理,处理之后就不再保留
RetentionPolicy.CLASS 注解信息保留到类对应的class文件中
RetentionPolicy.RUNTIME 由JVM读取,运行时使用
3. @自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitMethod {
}
public class InitDemo {
@InitMethod
public void init(){
System.out.println("init...");
}
@InitMethod
public void test(){
System.out.println("test...");
}
}
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("InitDemo");
Method[] methods = clazz.getMethods();
if(methods != null){
for (Method method : methods) {
boolean isInitMethod = method.isAnnotationPresent(InitMethod.class);
if(isInitMethod){
method.invoke(clazz.getConstructor(null).newInstance(null),null);
}
}
}
}
}
注解告诉编译器哪里有标注,通过反射机制去操作被注解标注的地方。