Java注解
一、简介:
Java注解是附加在代码中的一些元信息。
二、元注解:
元注解是指注解的注解在定义注解的时候需要用到。包括 @Retention @Target @Document @Inherited四种。
SOURCE: 不包括在class文件中的注解
CLASS: 包括在class文件中的注解
RUNTIME: 包括在class文件中的注解,并由虚拟机载入,可在运行时通过反射获取。(常用)
- @Retention:用于指定一条注解应该保留多长时间(默认值RetentionPolicy.CLASS)
- @Target:用于指定该注解可用于哪些元素上(如:类,方法,字段,构造器等)
- @Document :为像Javadoc这样的归档工具提供提示。
- @Inherited:只能用于对类的注解,表示该注解为继承注解。如果一个类具有继承注解那么它的所有子类都自动具有同样注解。
三、注解处理:
- 1.源码级注解处理(SOURCE):
可以将自定义注解处理器添加到java编译器中。命令javac -processor ProcessorClassName1,ProcessorClassName2 sourceFiles。编译器会定位源码中的注解,然后选择可用的注解处理器,每个注解处理器会依次执行。如果某个注解处理器创建了一个新的源文件,那么将重复执行这个处理过程处理新建的源文件。
自定义注解处理器需要扩展AbstractProcessor类。用 SupportedAnnotationTypes 描述处理器关注哪些注解。如:
@SupportedAnnotationTypes("xxxxx")
public class TestProcessor extends AbstractProcessor {
@Override
public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment roundEnv
) {
return false;
}
}
可参考:(懒得自己写,随便找了两个示例)
https://www.jianshu.com/p/6db8ad1b89c6
http://blog.csdn.net/duo2005duo/article/details/50541281
http://www.importnew.com/15246.html
- 2.字节码级别注解处理(CLASS):
编写一个工具类,去都去class文件然后修改class文件。需要用到字节码工程相关工具。
可参考:(懒得自己写,随便找了两个示例)
http://blog.csdn.net/PacosonSWJTU/article/details/50722281
在加载时修改字节码:
1)自定义类加载器:
2)利用javaagent然后在instrumentation.addTransformer(new xxxxx(){具体修改字节码的逻辑})
可参考:(懒得自己写,随便找了两个示例)
http://blog.csdn.net/yczz/article/details/51656386
运行参数:java -javaagent:xxx.jar=xfds -classpath kkkk
- 3运行期的注解处理(RUNTIME):
1)用spring aop代理,如:
execution(com.nw.base.base.Rest com.nw.base.controller.api.*.*(..)) and @annotation(apiLimit)
public Object exeApiLimit(ProceedingJoinPoint pjp, ApiLimit apiLimit){
// operation
}
2)用反射直接处理,如:
Field f = xxxxxxxx;
Resource resource = f.getAnnotation(Resource.class);
System.out.println(resource.name());
可参考:(懒得自己写,随便找了两个示例)
http://blog.csdn.net/doc_sgl/article/details/50367083
参考自:
JAVA核心技术II