可以在javassist中访问在Groovy脚本中声明的类吗?

时间:2016-08-10 07:08:59

标签: java groovy jvm javassist

我有一个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中加载它。但是,如果没有对此类进行额外的(重新)编译并使用我在普通操作中可以访问的类,是否可以这样做?

1 个答案:

答案 0 :(得分:1)

您可以将自定义代码源注册到Javassist ClassPool。默认情况下,如果调用ClassPool.getDefault(),Javassist将从类路径中读取类文件。您需要从Groovy获取类文件。

执行此操作的一种方法是从Java代理读取类文件,该代理允许使用ClassFileTransformer读取类文件。另一种方法是挂钩Groovy类加载器,加载脚本,所有类都通过findClass传递。