`
duzc2
  • 浏览: 60804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

在 Eclipse 里使用 Java 6 注解处理器

    博客分类:
  • Java
阅读更多

 

在 Eclipse 里使用 Java 6 注解处理器

原文:Using Java 6 processors in Eclipse

http://kerebus.com/2011/02/using-java-6-processors-in-eclipse/

 

    我没有找到这方面的完整的教程,所以花费两个小时的时间完成了这个,希望他能够节省你的时间。

    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代码注释

    编写一个简单的注释处理器,扫描并移除所有注释,然后使用Java Compiler API编译代码。这种方法需要一定的编程知识,但可以实现批处理大量文件的注释清除。 当然,对于非程序员或者希望快速操作的用户,也有一些第...

    java 自定义注解验证

    首先,我们需要理解Java注解的基本原理。注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不直接影响代码的执行。Java提供了内置的注解,如`@Override`、`@Deprecated`等,但自定义注解允许我们...

    java 设计模式eclipse用法大全

    5. **装饰器模式**: 装饰器模式动态地给对象添加新的职责,Eclipse中的注解处理器和AspectJ AOP框架实现了这一模式。 6. **代理模式**: 代理模式为其他对象提供一种代理以控制对这个对象的访问,Eclipse中的动态...

    Web Socket聊天例子.java eclipse

    在本示例中,我们将探讨如何使用Java和Eclipse开发一个WebSocket聊天应用。 首先,WebSocket API是Java EE 7及更高版本的一部分,这意味着你需要Eclipse IDE以及支持Java EE 7或更高版本的服务器(如Tomcat 7或更高...

    Eclipse下使用ButterKnifeZelezny

    在ButterKnife的使用过程中,你可能会遇到的问题包括但不限于:注解处理器配置不正确、IDE无法识别注解、运行时找不到绑定的字段等。这些问题通常可以通过检查依赖、清理项目、重启IDE等方式解决。 总结,...

    Java入门练习题的源代码(Eclipse导入即可)

    12. **枚举与注解**:枚举类型的应用,以及自定义注解及其处理器。 13. **设计模式**:如单例、工厂、观察者、装饰器等常见设计模式的实现。 通过这些练习题,新手不仅可以巩固理论知识,还能提升实际编程能力,...

    编译时注解示例

    在Java中,有两种类型的注解处理器:编译时处理器和运行时处理器。编译时处理器是在编译阶段执行的,可以用来修改源代码、生成额外的类文件或者执行其他验证操作。例如,`javax.annotation.processing.Processor`...

    java-annotation-processor-in-maven:在Maven中使用Java注释处理器进行测试

    在Maven中使用Java注释处理器进行测试 使用mvn clean install测试 输出示例: [loading /modules/java.base/java/lang/annotation/Annotation.class] Round 1: input files: {user.Hello} annotations: ...

    配置Eclipse编译器教程

    6. **Annotation Processing**:如果需要使用注解处理器,如Lombok,这个选项卡可以让你配置相关设置。 完成以上配置后,别忘了点击"Apply"和"OK"保存设置。现在,你的Eclipse已经按照指定的配置准备好了编译Java...

    eclipse-java,ssm配置运行教程

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 4. **Eclipse集成环境**:Eclipse是一款强大的Java开发工具,支持各种...

    使用Eclipse开发工具如何解决Java Compiler中Annotation Processin不出现的问题

    然而,当你在Eclipse中尝试使用注解处理器时,可能会遇到“Annotation Processing”选项缺失的问题。这通常是由于Eclipse缺少必要的Java开发工具组件导致的。 以下是如何在Eclipse中解决这个问题的详细步骤: 1. *...

    annotation-processor-hello-world:“Hello, World”示例演示了 Eclipse 中 Java 注释处理器的基本用法

    注释处理器:Hello World “Hello, World”示例演示了 Eclipse 中 Java 注释处理器的基本用法。 要使用它,您需要将Hello项目导出为.jar文件并将此.jar文件放入World/lib/ 。

    使用eclipse springMvc3.0 所需jar

    在开发Java Web应用程序时,Spring MVC是一个非常流行的框架,它为构建基于模型-视图-控制器(MVC)模式的应用提供了强大的支持。Eclipse作为Java开发的主流IDE,有着丰富的插件支持,使得集成Spring MVC变得简单易...

    Eclipse/Intel Xtend

    Eclipse/Intel Xtend 是一个基于Java平台的高级编程语言,它由Eclipse基金会开发并维护,旨在提供更简洁、更易读的语法,同时能够直接编译为Java字节码,使得开发者可以在享受现代语言特性的同时充分利用Java的生态...

    m2e-apt-poc:使用与 Eclipse 集成的 Maven 进行注释处理的概念证明

    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源代码的预处理器。 在Eclipse环境中可轻松扩展

    java_codegen-Java源代码的预处理器。 您在代码中添加以// [$ ... $]或//[$ ... $]打开并以// $$或//$$关闭的特殊行注释,然后运行预处理器。 例子 有一个示例可以转换下面的行: public class HelloWorldExample ...

    eclipse emf&gef

    **1.3.5 使用Java接口注解进行建模** 这种方式更适合那些希望将模型定义集成到现有Java代码中的开发者。 **1.3.6 EMF特性** - 强大的模型定义能力。 - 自动生成代码。 - 支持图形编辑器。 **1.3.7 EMF模型创建**...

    在eclipse中加入XDoclet templates方便书写hibernate元数据

    XDoclet是一款强大的Java注解处理器,它可以根据注释自动生成持久化层的代码、配置文件,如Hibernate的实体类、映射文件等,从而减轻开发者手动编写这些文件的工作量。 XDoclet的使用主要涉及以下几个关键知识点: ...

Global site tag (gtag.js) - Google Analytics