JDK 5 加入了 APT(注解处理工具)。它曾是 SDK 的一部分,但它在非官方的 com.sun.* 包里,而且还必须使用“apt”工具来处理源代码。
JDK6清理了这些API,并将他们集成到 javac 中,所以现在不必再使用独立的apt工具了。
显然,在把源代码编译成class文件之前根据注解对他们做一些处理,可以用来做一些很有意思的事情。比如代码生成和于 IDE 无关的代码分析;而且你不必直接使用注解。我猜 JPA2 的 meta-model 在他的标准API中就是使用了这个技术实现的。
我用 Eclipse 写了一个 java 6 注解处理器的例子。所有的内容都可以集成到 maven 中,但我只是集中精力在怎样在 Eclipse 上实现他。
所以我们要做个注解处理器,可以用它来对工程中的每个类生成一个新的类。另外,我们再让以 T 字母开头的类显示一个警告。对,这很傻。
第一步:新建一个处理器工程
SillyProcessor.java:
@SupportedAnnotationTypes(value= {"*"})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class SillyProcessor extends AbstractProcessor {
private Filer filer;
private Messager messager;
@Override
public void init(ProcessingEnvironment env) {
filer = env.getFiler();
messager = env.getMessager();
}
@Override
public boolean process(Set elements, RoundEnvironment env) {
for (Element element : env.getRootElements()) {
if (element.getSimpleName().toString().startsWith("Silly")) {
// 不要循环为已经生成的类生成新的类
continue;
}
if (element.getSimpleName().toString().startsWith("T")) {
messager.printMessage(Kind.WARNING,
"This class name starts with a T!",
element);
}
String sillyClassName = "Silly" + element.getSimpleName();
String sillyClassContent =
"package silly;\n"
+ "public class " + sillyClassName + " {\n"
+ " public String foobar;\n"
+ "}";
JavaFileObject file = null;
try {
file = filer.createSourceFile(
"silly/" + sillyClassName,
element);
file.openWriter()
.append(sillyClassContent)
.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
}
将这个处理器注册到 Eclipse 上,我建立如下 META-INF 文件:
META-INF/services/javax.annotation.processing.Processor:
com.kerebus.annotation.processor.SillyProcessor
这里只包含了处理器实现类的类名。我不确定你是否可以在这里列出多个处理器。
就这样。现在导出一个 jar 文件,并且在你需要用到这个处理器的工程上导入这个文件。
第二步:建立一个使用你的处理器的工程
In the properties for your new project go to Java Compiler -> Annotation Processing
Check the “Enable Project Specific Settings” and make sure “Enable annotation processing”
is checked. I also changed the generated source directory to a name
which didn’t start with a dot so it wouldn’t be hidden in the package
explorer (files or directories which start with a dot are by default
filtered away in eclipse).
在工程的属性中找到 Java Compiler -> Annotation Processing 查看 “Enable Project Specific Settings” 确认 “Enable annotation processing” 被选中。为了不让他在包浏览器中隐藏,我还修改了 generated source directory ,去掉了开始的点(Eclipse 会将文件名以点开始的文件或文件夹过滤掉)。
然后,转到 Java Compiler -> Annotation Processing -> Factory Path 你可以在这里导入处理器的 jar 文件。不可以使用工程引用。
点击 “Advanced” 按钮,会显示一个对话框,列出了 META-INF/services/javax.annotation.processing.Processor 文件中的内容。选择它并按OK。
第三步:Build!
完成了。这是在我的工程里显示的样子:
So we get a warning for the Thing class because its class name start
with a “T” and for each class in the project we get corresponding
“Silly” classes generated. These are compiled and usable just like any
other normal class.
由于 Thing 类是 T 开头,所以有一个警告,并且每一个工程里的类都生成了一个对应的“Silly”类。这些类的编译和使用与其他普通的类一样。
欲了解更多请参看 eclipse jdt/apt docs, this bit about creating a code analyzer 或者 offical docs
相关推荐
编写一个简单的注释处理器,扫描并移除所有注释,然后使用Java Compiler API编译代码。这种方法需要一定的编程知识,但可以实现批处理大量文件的注释清除。 当然,对于非程序员或者希望快速操作的用户,也有一些第...
首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不直接影响代码的执行。Java提供了内置的注解,如`@Override`、`@Deprecated`等,但自定义注解允许我们...
5. **装饰器模式**: 装饰器模式动态地给对象添加新的职责,Eclipse中的注解处理器和AspectJ AOP框架实现了这一模式。 6. **代理模式**: 代理模式为其他对象提供一种代理以控制对这个对象的访问,Eclipse中的动态...
在本示例中,我们将探讨如何使用Java和Eclipse开发一个WebSocket聊天应用。 首先,WebSocket API是Java EE 7及更高版本的一部分,这意味着你需要Eclipse IDE以及支持Java EE 7或更高版本的服务器(如Tomcat 7或更高...
在ButterKnife的使用过程中,你可能会遇到的问题包括但不限于:注解处理器配置不正确、IDE无法识别注解、运行时找不到绑定的字段等。这些问题通常可以通过检查依赖、清理项目、重启IDE等方式解决。 总结,...
12. **枚举与注解**:枚举类型的应用,以及自定义注解及其处理器。 13. **设计模式**:如单例、工厂、观察者、装饰器等常见设计模式的实现。 通过这些练习题,新手不仅可以巩固理论知识,还能提升实际编程能力,...
在Java中,有两种类型的注解处理器:编译时处理器和运行时处理器。编译时处理器是在编译阶段执行的,可以用来修改源代码、生成额外的类文件或者执行其他验证操作。例如,`javax.annotation.processing.Processor`...
在Maven中使用Java注释处理器进行测试 使用mvn clean install测试 输出示例: [loading /modules/java.base/java/lang/annotation/Annotation.class] Round 1: input files: {user.Hello} annotations: ...
6. **Annotation Processing**:如果需要使用注解处理器,如Lombok,这个选项卡可以让你配置相关设置。 完成以上配置后,别忘了点击"Apply"和"OK"保存设置。现在,你的Eclipse已经按照指定的配置准备好了编译Java...
MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 4. **Eclipse集成环境**:Eclipse是一款强大的Java开发工具,支持各种...
然而,当你在Eclipse中尝试使用注解处理器时,可能会遇到“Annotation Processing”选项缺失的问题。这通常是由于Eclipse缺少必要的Java开发工具组件导致的。 以下是如何在Eclipse中解决这个问题的详细步骤: 1. *...
注释处理器:Hello World “Hello, World”示例演示了 Eclipse 中 Java 注释处理器的基本用法。 要使用它,您需要将Hello项目导出为.jar文件并将此.jar文件放入World/lib/ 。
在开发Java Web应用程序时,Spring MVC是一个非常流行的框架,它为构建基于模型-视图-控制器(MVC)模式的应用提供了强大的支持。Eclipse作为Java开发的主流IDE,有着丰富的插件支持,使得集成Spring MVC变得简单易...
Eclipse/Intel Xtend 是一个基于Java平台的高级编程语言,它由Eclipse基金会开发并维护,旨在提供更简洁、更易读的语法,同时能够直接编译为Java字节码,使得开发者可以在享受现代语言特性的同时充分利用Java的生态...
m2e-apt-poc是一个项目,旨在展示如何在Eclipse环境中利用Maven插件m2e-apt与Java的注解处理器(Annotation Processor)协同工作,实现无缝集成。 **一、什么是注解处理(Annotation Processing)** 注解处理是...
- **Java解析器**:更专业的方式是使用Java解析库,如ANTLR、JavaCC等,它们能解析Java语法结构,区分代码和注释,从而方便地去除注释。 - **IDE插件**:许多集成开发环境(IDEs),如Eclipse和IntelliJ IDEA,...
java_codegen-Java源代码的预处理器。 您在代码中添加以// [$ ... $]或//[$ ... $]打开并以// $$或//$$关闭的特殊行注释,然后运行预处理器。 例子 有一个示例可以转换下面的行: public class HelloWorldExample ...
**1.3.5 使用Java接口注解进行建模** 这种方式更适合那些希望将模型定义集成到现有Java代码中的开发者。 **1.3.6 EMF特性** - 强大的模型定义能力。 - 自动生成代码。 - 支持图形编辑器。 **1.3.7 EMF模型创建**...
XDoclet是一款强大的Java注解处理器,它可以根据注释自动生成持久化层的代码、配置文件,如Hibernate的实体类、映射文件等,从而减轻开发者手动编写这些文件的工作量。 XDoclet的使用主要涉及以下几个关键知识点: ...