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

 

在 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

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中的问题主要是关于在Eclipse使用MAP的问题。根据提供的引用内容,可以看出您遇到了ClassNotFoundException的错误。这个错误通常是由于找不到类的实现引起的。为了解决这个问题,您可以尝试以下几个步骤: 1. 确保您的项目中已经正确引入了Mapstruct和相关的依赖库。可以通过在项目的pom.xml文件中添加相应的依赖项来解决。确保您使用的是正确的版本和配置。 2. 检查您的编译设置,确保您的项目正确地引用了Mapstruct的注解处理器。在Eclipse中,您可以通过右键单击项目,选择"Properties",然后选择"Java Compiler"来查看和配置注解处理器。确保您已经启用了"Enable annotation processing"选项,并且在"Factory Path"下添加了Mapstruct的引用。 3. 检查您的代码,确保您正确地使用了Mapstruct的注解。Mapstruct使用注解来生成转换器的实现类,因此您需要在适当的位置标记您的转换器类和方法。确保您的转换器类上使用了`@Mapper`注解,并且您的方法上使用了适当的映射注解,如`@Mapping`。 4. 如果以上步骤都没有解决问题,您可以尝试重新构建和清理您的项目。有时候编译器可能会出现一些问题,重新构建和清理项目可以帮助解决一些编译错误。 希望以上提供的步骤可以帮助您解决在Eclipse使用Mapstruct的问题。如果问题仍然存在,请提供更多的详细信息,以便我们能够更好地帮助您解决问题。<span class="em">1</span> #### 引用[.reference_title] - *1* [eclipse支持mapstruct,解决ClassNotFoundException](https://blog.csdn.net/applecc/article/details/125384684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值