2016-08-10 108 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類加載器。

相關問題