2016-08-10 75 views
0

我有声明某一类Groovy脚本。我可以通过javassist在同一个脚本中访问这个类吗?我需要为它创建一个CtClass对象。可以在javassist中访问Groovy脚本中声明的类吗?

这里是脚本,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

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

一种方法是从Java代理,允许读取使用ClassFileTransformer类文件读取的类文件。另一种方法是挂接到加载所有类通过findClass通过脚本Groovy类加载器。

相关问题