Tag: 注释处理

在junit测试中获取一个类作为javax.lang.model.element.Element

我想测试我的实用程序类ElementUtils但我不知道如何将类作为元素。 在AnnotationProcessors中,我使用以下代码获取元素 Set elements = roundEnvironment.getElementsAnnotatedWith(annotation); 但由于RoundEnvironment在测试中不可用,因此不能选择。 有没有办法将类作为javax.lang.model.element.Element?

Eclipse 3.5+ – 注释处理器:无法导入生成的类

我正在使用第三方注释处理器从我的项目中的带注释的类生成元数据代码(.java文件)。 我已经通过Eclipse(Properties – > Java Compiler – > Annotation Processing)成功配置了处理器,代码生成工作正常(代码自动创建和生成)。 此外,Eclipse成功自动完成生成的类及其字段,没有任何错误。 假设我有一个类“some.package.Foo”,生成的元数据类是“some.package.Foo_”。 在自动完成的帮助下,我可以在Eclipse编辑器中获得以下代码,没有任何错误: import some.package.Foo_; … public class Test { void test() { Foo_.someField = null; // try to access a field from the generated class Foo_ } } 但是,一旦我实际构建项目(或者只是保存文件,因为Build自动启用),我得到的错误告诉“some.package.Foo_”无法解析。 似乎Eclipse正在同时生成和编译some.package.Foo_,或者更有可能。 我找到了两个临时解决方案(这实际上阻碍了注释处理器的使用): 在每次生成所生成的类之前,右键单击每个生成的文件,转到“属性”,然后取消选中“派生”标记。 之后,我对项目进行清理并且导入很好 – 没有更多的错误。 但是,如果我再次进行清理,则会再次显示错误,因为文件的生成会导致再次(自动)检查“派生”标记。 所以这真非常烦人且耗时。 我还取消选中所有这些文件中的“Derived”标记,这次我取消选中包含这些文件的源文件夹和包中的“Derived”标记。 然后我禁用注释处理器,然后进行清理。 没有更多的导入错误,即使我做了另一次清理,但使用注释处理器没有任何好处,因为如果我要更改一些会更新模型的东西,我需要重新打开注释处理器,并重复在生成这些文件的新版本之后,这个繁琐的程序将其关闭。 这是Eclipse中的错误吗? 如果是的话,是否有比上述两个更好的解决方法或快速解决方案? 如果没有,我应该尝试解决这个问题? 我也尝试重新排列构建路径上的库的顺序,但它没有帮助。

maven中的注释处理器输出

我正在使用JSR 269作为在编译期间分析代码的方法,并在需要时将其失败。 我在maven中显示我的注释处理器的输出时遇到了麻烦(Ant确实显示了输出)我正在使用javax.annotation.processing.Messager来显示警告和错误,但在maven中我没有看到它的输出。 (我确实知道它运行,因为它生成的代码应该如此)。 有任何想法吗?

如何使用Java8获取VariableElement的类型注释和属性值?

请考虑以下代码: public class SimpleTest { private Map<@JSON Integer,Map> map; } 使用最新的JDK8 API进行注释处理,如何从VariableElement访问注释列表( @JSON , @ Frzen和@Enumerated )及其相应的属性( @Enumerated的值和测试)? final VariableElement mapElm = els.stream().filter(x -> x.getSimpleName().contentEquals(“map”)).findFirst().get(); ??? ??? 我尝试过很多技巧,比如mapElm.getTypeArguments().get(0) for @Json Integer但是我从来没有成功地抓住注释@JSON …… 编辑 :通过访问JDK的内部类,我可以访问这些注释,但它是如此hacky和敏感的impl变化,我想知道是否有更好的方法 public static class SimpleEntityCodecFactoryTest { private Map<@JSON Integer,Map> map; } final TypeElement typeElement = elementUtils.getTypeElement(SimpleEntityCodecFactoryTest.class.getCanonicalName()); final List els = ElementFilter.fieldsIn(typeElement.getEnclosedElements()); final […]

使用Java 6注释处理器获取generics类型的限定类名

我正在使用JDK 6的Annotation Processing API开发一个小代码生成器,并试图获得类中字段的实际generics类型。 为了更清楚,让我说我有这样一个类: @MyAnnotation public class User { private String id; private String username; private String password; private Set roles = new HashSet(); private UserProfile profile; } 这是我的注释处理器类: @SupportedAnnotationTypes({ “xxx.MyAnnotation” }) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class MongoDocumentAnnotationProcessor extends AbstractProcessor { private Types typeUtils = null; private Elements elementUtils = null; @Override public synchronized void init(ProcessingEnvironment […]

如何在Java注释处理器中获取正确的JavaFileManager?

我通过扩展在Eclipse上下文中调用的javax.annotation.processing.AbstractProcessor来编写Java注释处理器,它工作正常,除了我需要有关处理器工作的源路径和类路径的更多信息: @SupportedAnnotationTypes({“MyAnno”}) @SupportedSourceVersion(SourceVersion.RELEASE_8) public class Processor extends AbstractProcessor { @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { // this used to work in Java4 but not anymore (since Java6?): String sourcePath = processingEnv.getOptions().get(“sourcepath”); String classPath = processingEnv.getOptions().get(“classpath”); for (Element e : roundEnv.getElementsAnnotatedWith(MyAnno.class)) { myProcess(e, sourcePath, classPath); } return true; } } 问题是如何在注释处理上下文( process的实现)中检索有效的JavaFileManager ,它可以为我提供源路径和当前正在执行注释处理器的编译器的类路径。 最好,我会找到一个不涉及对Eclipse […]

无法在注释处理器中加载资源(不在类路径上)

我有一个注释处理器,它将生成一个枚举,其中包含由接口的getter方法定义的键。 界面位于 MyProject的/ src目录/主/ JAVA / my.package.MyInterfaces.java。 我想validation驻留在MyProject/src/main/resources/META-INF/resource-bundle/的属性文件,如果它们包含生成的枚举中定义的键。 我的问题是属性文件不能通过处理器的类加载器或Filer.getResource(…)获得。 如何使该项目的源或类路径可供处理器使用,以便我可以加载属性文件? 现在我只有处理器所在的jar中的资源可用。 我尝试通过eclipse Project / Properties / Java编译器/ Annotation处理/处理器选项来定义-classpath和/或-sourcepath但是它没有用。 有没有人遇到这样的问题,谁能给我一个关于如何为处理器提供资源的线索? 我确实有maven结构,但不使用maven,因为应用程序中的旧依赖项。 所以maven现在不适合我。 Eclipse 3.6 Helios似乎在Filer#getResource()中没有实现StandardLocation.SOURCE_PATH和StandardLocation.CLASS_PATH ,因此将生成的源文件或类文件写入SOURCE_PATH或CLASS_PATH似乎是不可能的,同时访问SOURCE_PATH和CLASS_PATH上的任何文件* 谢谢。

Eclipse – Annotation处理器,获取项目路径

我正在为eclipse构建一个注释处理器插件,我想要做的是在处理过程中检查项目文件夹中的几个文件。 我想知道如何从我的处理器中获取项目路径。 我相信这可以做到,因为项目源路径提供给处理器 – 但我找不到一种方法来达到它。 我试着查看System.properties和processingEnv.getOptions(),但那里没有有用的信息.. 最后我想在Netbeans上使用这个注释处理器,所以如果有一个公共API可以提供这些信息,那将是最好的 – 但任何帮助将不胜感激..

如何使用Java 1.6 Annotation Processing执行编译时编织?

我创建了一个注释,将其应用于DTO并编写了Java 1.6样式的annotationProcessor。 我可以看到如何让annotationProcessor编写一个新的源文件,这不是我想要做的,我看不到或者找不到如何修改现有的类(理想情况下只修改字节代码)。 修改实际上是相当简单的,我希望处理器做的就是插入一个新的getter和setter,其名称来自正在处理的注释的值。 我的注释处理器看起来像这样; @SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedAnnotationTypes({ “com.kn.salog.annotation.AggregateField” }) public class SalogDTOAnnotationProcessor extends AbstractProcessor { @Override public boolean process(final Set annotations, final RoundEnvironment roundEnv) { //do some stuff } }

Java Generics:在运行时访问Generic Type

我想在运行时访问声明字段的generics类型。 我之前的印象是,由于Java类型擦除,这是不可能的。 但是,情况并非如此,因为一些众所周知的框架在运行时通过reflection来利用generics类型。 例如,Guice将根据您提供的generics类型实现Provider: public class Injectable{ @Inject private Provider someTypeProvider; } 如何通过reflectionAPI访问字段的“SomeType”generics属性或任何此类类型/方法/等? 此外,了解如何通过Java 6 Annotation Processor API访问这些generics类型属性也很有帮助。 谢谢。 编辑: 谢谢大家的指示。 我找到了一种方法,使用haylem的链接,特别是Prenkov的文章Java Reflection:Generics 。 这是我正在寻找的答案: /** * @author John Ericksen */ public class TypeReflectionExample { public class SomeType{} public class Injectable{ @Inject private Provider someTypeProvider; } public static void main(String[] args){ try { Field providerField […]