我有一个Groovy脚本,它声明了某个类。我可以通过javassist在同一个脚本中访问此类吗?我需要为它创建一个CtClass对象。
以下是脚本test.groovy:
的示例import javassist.*;
public class TestClass {
public String testMethod(String x) {
return x + ".";
}
}
// I can use TestClass now for ordinary operations
TestClass obj = new TestClass();
println(obj.testMethod("a"));
ClassPool pool = ClassPool.getDefault(); // ?
CtClass cc = pool.getCtClass("TestClass"); // this doesn't work
最后一个字符串会导致错误:
Caught: javassist.NotFoundException: TestClass
javassist.NotFoundException: TestClass
at javassist.ClassPool.get(ClassPool.java:450)
at javassist.ClassPool.getCtClass(ClassPool.java:515)
at javassist.ClassPool$getCtClass$0.call(Unknown Source)
at test.run(test.groovy:14)
当然可以将这个类移到脚本之外并将其编译为.class文件,然后很容易加载它。我认为在脚本中也可以将这个类再次动态编译为字节数组或.class文件,然后在javassist中加载它。但是,如果没有对此类进行额外的(重新)编译并使用我在普通操作中可以访问的类,是否可以这样做?
答案 0 :(得分:1)
您可以将自定义代码源注册到Javassist ClassPool
。默认情况下,如果调用ClassPool.getDefault()
,Javassist将从类路径中读取类文件。您需要从Groovy获取类文件。
执行此操作的一种方法是从Java代理读取类文件,该代理允许使用ClassFileTransformer
读取类文件。另一种方法是挂钩Groovy类加载器,加载脚本,所有类都通过findClass
传递。