Tag: 代码生成

是否有运行时代理创建库,它支持保留代理类的注释?

使用例如cglib或javassist代理创建代理时 ,通过创建代理目标的子类来实现此代理。 但是,这意味着此代理上的注释将丢失。 当一个类由两个库处理时,这是有问题的,其中: 第一个库需要创建给定类的代理才能运行。 第二个库通过从中读取注释来处理对象。 对于第二个库,当同时使用第一个库时,注释已消失。 问题是:是否存在具有高级API的运行时代码生成库,可以轻松保留代理类的注释?

适用于maven的java代码生成器?

我正在使用maven开发一个生成代码文件的java项目。 我正在寻找一个可用于maven的良好代码生成器。 到目前为止我试过了 com.tikal.maven tikal-maven-jet-plugin 0.3.0 这个插件的优点是它在构建周期中生成生成器,并且不添加任何运行时依赖项。 但是,我无法测试它,因为我找不到maven存储库来下载它。 那么我应该使用哪个代码生成器? (或者我在哪里可以找到工作的tikal存储库?)

使用AnnotationProcessor构建Maven,解析src / main / java中的文件,并生成源代码到generate-test-sources / test-annotations

我正在使用maven 3.0.3和Java7。 我有一个AnnotationProcessor,它应该解析src/main/java ( 不是 src/test/java )中带注释的java文件,并为JUnit-Tests生成Helper-Classes。 这些Helper-Class应该存储在target/generated-test-sources/test-annotations因为它们使用的库只在测试范围内可用。 (注意:只要这个依赖关系不在测试范围内,一切都可以正常工作,但是编译就会失败。它肯定只在测试范围/unit testing和编译测试类时才需要。) 我试了好几个配置而没有任何运气: 我将maven-compiler-plugin配置为在compile:compile期间使用AnnotationProcessor。 生成的HelperClass将存储在generated-sources/annotations 。 不在 generated-test-sources/test-annotations中。 结果是,不会使用Test-Scoped依赖项。 由于编译错误“无法找到符号”,构建失败。 失败 我使用了上面的配置并重新定义了generatedSourcesDirectory: ${project.build.directory}/generated-test-sources/test-annotations 生成的类将按预期存储在generated-test-sources/test-annotations中,但构建仍然失败,因为它尝试按上述方式编译该文件并错过了测试范围的依赖项。 失败 我尝试使用上面的配置并排除**/generated-test-sources/test-annotations/**/*.java以防止编译器在此阶段进行编译: **/generated-test-sources/test-annotations/**/*.java 没运气。 与上面相同的编译器错误。 失败 我将maven-compiler-plugin配置为在test-compile:testCompile期间使用AnnotationProcessor test-compile:testCompile 。 HelperClass理论上可能是在generated-test-sources/test-annotations中generated-test-sources/test-annotations ,但是AnnotationProcessor不会偶然发现位于src/main/java的带注释的类,而不是src/test/java中的AFAIK test-compile:testCompile期间test-compile:testCompile范围test-compile:testCompile 。 因此,找不到Annotated类,HelperClass将不会生成,因此不能存储在generated-test-sources 。 失败 试图在compile:testCompile期间运行compile:testCompile和test-compile:compile ,这在两种情况下都导致src / main / java的类尚未编译 – 因此编译错误。 失败 我真正想做的是: 配置编译器在compile:compile期间使用AnnotationProcessor compile:compile生成我的HelperClass到${project.build.directory}/generated-test-sources/test-annotations 但不要让maven编译它 然后在test-compile:testCompile期间test-compile:testCompile 。 我没有这样做。 我不确定我是否缺少重要的maven基础知识(概念),或者排除配置是否存在问题,或者不管它是什么。 […]

以编程方式实现以各种指定方式组合同一接口的某些实例的接口

实现以各种指定方式组合同一接口的某些实例的接口的最佳方法是什么? 我需要为多个接口执行此操作,并且我希望最小化样板并仍然实现良好的效率,因为我需要将其用于关键生产系统。 这是问题的草图。 抽象地说,我有一个通用的组合器类,它接受实例并指定各种组合器: class Combiner { I[] instances; T combineSomeWay(InstanceMethod method) { // … method.call(instances[i]) … combined in some way … } // more combinators } 现在,假设我想在许多其他界面中实现以下界面: Interface Foo { String bar(int baz); } 我想最终得到这样的代码: class FooCombiner implements Foo { Combiner combiner; @Override public String bar(final int baz) { return combiner.combineSomeWay(new InstanceMethod { @Override […]

Java代码生成

我正在寻找漂亮的(java)代码生成引擎。 我找到了cglib,但文档记录很差,我不太确定它是否可以生成实际的java类(文件)和动态类。 如果我错了,也许有人知道有一个例子的链接。 罗马

无法使用AutoValue和IntelliJ解析符号

我一直在尝试为IntelliJ的注释处理找到正确的设置,以便它与Gradle的构建过程共存。 每当我使用IntelliJ构建时,我都无法识别gradle-apt-plugin中生成的源代码。 我对我的项目的要求是: IntelliJ和Gradle之间的构建应该是无缝的,不会干扰彼此的过程 我需要使用IntelliJ的每个源集创建单独的模块选项 我需要使用IntelliJ的基于文件夹的结构 IntelliJ需要能够识别并自动完成AutoValue类 以下是使用IntelliJ 2017.2.4和Gradle 3.5重现问题的MCVE的步骤: 从IntelliJ创建一个新的Gradle项目 选中“为每个源设置创建单独的模块”选项 打开build.gradle文件: 添加以下plugins块: plugins { id ‘java’ id ‘net.ltgt.apt’ version ‘0.12’ } 添加以下dependencies块 dependencies { compileOnly ‘com.google.auto.value:auto-value:1.5’ apt ‘com.google.auto.value:auto-value:1.5’ } 转到设置→构建,执行,部署→注释处理器 选中“ 启用注释处理” 创建一个类: @AutoValue public abstract class GeneratedSourcesTest { static GeneratedSourcesTest create(String field) { return new AutoValue_GeneratedSourcesTest(field); } public abstract String field(); } […]

从WSDL生成代码会导致exception

我正在使用Axis2 1.5.1(wsdl2java)从给定的WSDL文件生成代码(客户端存根)。 Web服务由外部应用程序提供。 … RemoteApplication0.xsd的内容如下: 命令行: wsdl2java -ss -g -d adb -or -p com.sampleapp.ws.generated.client -uri SampleRemoteProcess.wsdl 生成过程会导致exception。 堆栈跟踪: Using AXIS2_HOME: C:\develop\axis2-1.5.1-bin\axis2-1.5.1\ Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0_21 Retrieving document at ‘C:\temp\SampleRemoteProcess.wsdl’. Retrieving schema at ‘SampleApp.App.ApplicationManager.RemoteApplication0.xsd’, relative to ‘file:/C:/temp/SampleRemoteProcess.wsdl’. Retrieving schema at ‘SampleApp.App.ApplicationManager.RemoteApplication1.xsd’, relative to ‘file:/C:/temp/SampleRemoteProcess.wsdl’. Retrieving schema at ‘SampleApp.App.ApplicationManager.RemoteApplication2.xsd’, relative to ‘file:/C:/temp/SampleRemoteProcess.wsdl’. Retrieving schema at ‘SampleApp.App.ApplicationManager.RemoteApplication3.xsd’, relative […]

如何生成源代码来创建我正在调试的对象?

我的典型场景: 我处理的遗留代码有一个只有生产中的客户端才有的错误 我附加了一个调试器,并找出如何在给定输入的情况下在其系统上重现该问题。 但是,我不知道为什么错误发生了。 现在我想在我的本地系统上编写一个自动化测试来尝试重现然后修复bug 最后一步真的很难。 输入可能非常复杂并且有大量数据。 手动创建输入(例如: P p = new P(); p.setX(“x”); p.setY(“x”);想象这样做1000次以创建对象)非常繁琐且容易出错。 事实上你可能会注意到我刚给出的例子中有一个拼写错误。 是否有一种自动方式从调试器中的断点处获取字段并生成将创建该对象的源代码,以相同的方式填充? 我唯一想到的就是序列化这个输入(例如使用Xstream)。 我可以将其保存到文件中并在自动测试中将其读回。 这有一个主要问题:如果类以某种方式发生变化(例如:重命名了字段/ getter / setter名称),我将无法再反序列化该对象。 换句话说,测试非常脆弱。

在gradle中更改生成代码的输出目录

Project包含注释处理器,它在编译期间生成java代码。 默认情况下,gradle输出生成的源文件到build/classes目录中。 这会导致IntelliJ发现新生成的源文件时出现一些问题。 是否有任何直接的方法配置gradle将源文件输出到另一个目录? 例如$buildDir/gen/main/java或$buildDir/build/generated/main/java ?

如何使用JDT / AST将代码段添加到方法体

我正在尝试使用JDT / AST生成Java源代码。 我现在有MethodDeclaration,并希望将代码片段(来自其他来源)添加到方法体。 代码段可以包含任何Java代码, 甚至是语法无效的代码 。 我只是找不到这样做的方法。 使用JCodeModel,您将使用JBlock#directStatement(String s)方法 。 有没有办法用JDT / AST做到这一点?