我有一个使用javac/aspectj编译器编译的Maven项目。
我想在已编译的javassist程序的类上运行,该程序会操纵已编译的类并向其中添加内容。
我认为可以使用“过程类”阶段来运行我的工具。
我的问题是,用javassist迭代“目标/类”中创建的类文件的最佳方法是什么,以便以后可以加载,修复和保存。
另一个要求是也要在测试类上运行该工具。
如果有一个做类似工作的开源项目,那么看到一个实时示例将是很棒的。
谢谢,
阿夫纳
最佳答案
最近,我偶然发现了相同的问题,并编写了一个小型Maven插件,以在构建期间应用Javassist类转换。我已经在https://github.com/drochetti/javassist-maven-plugin上共享了代码
您已经猜对了,应该使用进程类阶段,而棘手的部分是类路径设置。经过一些试验和错误之后,我设法猜测了Project,Dependencies和Javassist之间的整个ClassPath问题(如果要检查解决方案,请引用com.github.drochetti.javassist.maven.JavassistMojo.execute()
代码)。
上面的GitHub链接上有一些准则,但是基本上您需要:
1-在 pom.xml 上配置插件
<plugin>
<groupId>com.github.drochetti</groupId>
<artifactId>javassist-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<configuration>
<includeTestClasses>false</includeTestClasses>
<transformerClasses>
<transformerClass>com.domain.ToStringTransformer</transformerClass>
</transformerClasses>
</configuration>
<executions>
<execution>
<phase>process-classes</phase>
<goals>
<goal>javassist</goal>
</goals>
</execution>
</executions>
</plugin>
2-实现
ClassTransformer
,这是一个示例:/**
* Silly transformer, used to hack the toString method.
*/
public class ToStringTransformer extends ClassTransformer {
/**
* We'll only transform subtypes of MyInterface.
*/
@Override
protected boolean filter(CtClass candidateClass) throws Exception {
CtClass myInterface = ClassPool.getDefault().get(MyInterface.class.getName());
return !candidateClass.equals(myInterface) && candidateClass.subtypeOf(myInterface);
}
/**
* Hack the toString() method.
*/
@Override
protected void applyTransformations(CtClass classToTransform) throws Exception {
// Actually you must test if it exists, but it's just an example...
CtMethod toStringMethod = classToTransform.getDeclaredMethod("toString");
classToTransform.removeMethod(toStringMethod);
CtMethod hackedToStringMethod = CtNewMethod.make(
"public String toString() { return \"toString() hacked by Javassist\"; }",
classToTransform);
classToTransform.addMethod(hackedToStringMethod);
}
}
注意:要实现转换器,您需要将插件添加为项目的依赖项,但是不用担心,因为它仅在构建时使用,可以提供,而是作用域的,这样就不会成为依赖项您的最终版本。
希望对您有所帮助!让我知道您是否需要进一步的帮助。
丹尼尔
关于java - 将Javassist字节码操作与Maven编译集成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12423157/