java基础之注解
注解
java中包含5种元注解
-
@Target 表示注解可用于哪些地方,包含TYPE(类)、METHOD(方法)、PARAMETER(参数)、CONSTRUCTOR(构造器)、FIELD(字段)、LOCAL_VARIABLE(局部变量)、ANNOTATION_TYPE、PACKAGE(包)、TYPE_PARAMETER、TYPE_USE
-
@Retention 表示注解信息保存的生命周期 SOURCE(注解被编译器丢弃)、CLASS(注解在class文件中可用,会被VM丢弃)、RUNTIME(VM在运行期也保留注解,可通过反射机制读取注解的信息)
-
@Documented 将此注解保存在Javadoc中
-
@Inherited 允许子类继承父类的注解
-
@Repeatable 允许一个注解可以被使用一次或多次
注解处理器用来处理注解进行工作,对于RUNTIME的注解可以在运行期操作,可以使用反射,而SOURCE和CLASS就只能在注解处理器Processor来操作了
注:注解处理器要和项目分开
注解处理器项目需要添加maven插件 该项目编译时不加载注解处理器,不然会报错
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>
-proc:none
</compilerArgument>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin><plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgument>
-proc:none
</compilerArgument>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
注解处理器注册
需要在resources下创建META-INF目录,创建services目录,创建javax.annotation.processing.Processor文件,在里面写上处理器的全路径
com.zhanghe.MyProcessor
@SupportedAnnotationTypes({"com.zhanghe.Test"}) // 支持哪些注解
@SupportedSourceVersion(SourceVersion.RELEASE_8) // 支持哪个版本
public class MyProcessor extends AbstractProcessor {
private Filer filer;
private Locale locale;
private Elements elements;
private Types types;
private StandardJavaFileManager standardJavaFileManager;
/**
* 该方法再编译期间会被注入一个ProcessingEnvironment对象,该对象包含了很多有用的工具类。
*
* @param processingEnv
*/
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
filer = processingEnv.getFiler();
locale = processingEnv.getLocale();
elements = processingEnv.getElementUtils();
types = processingEnv.getTypeUtils();
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> collector = new DiagnosticCollector<>();
standardJavaFileManager = javaCompiler.getStandardFileManager(collector, null, null);
}
/**
* 相当于main方法
*/
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (TypeElement annotation : annotations) {
System.out.println(annotation);
}
for (Element element : roundEnv.getElementsAnnotatedWith(Test.class)) {
if (element.getKind() == ElementKind.CLASS) {
TypeElement typeElement = (TypeElement) element;
PackageElement packageElement = elements.getPackageOf(element);
String packagePath = packageElement.getQualifiedName().toString();
String className = typeElement.getSimpleName().toString();
System.out.println("packagePath:" + packagePath);
System.out.println("className:" + className);
}
System.out.println(element.getKind() +
" : " + element.getModifiers() +
" : " + element.getSimpleName() +
" : " + element.asType());
}
return false;
}
}
准备使用注解处理器修改源文件,之后再研究
本文由 mdnice 多平台发布
本文来自博客园,作者:拾光师,转载请注明原文链接:https://www.cnblogs.com/life-time/p/17864217.html 个人博客-> https://zhhll.icu
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!