2012-03-01 65 views
1

我想獲得CtClass對我的模型類的引用。我從最簡單的版本 ClassPool.getDefault().get(className);開始,它工作得很好。但只能在我的機器上。它在服務器上不起作用。用playframework獲取javassist類

無論如何,我認爲該版本不應該工作,因爲Playframework存儲類在tmp /類。所以現在我完成了這個版本:

ClassPool pool = new ClassPool(); 
pool.appendClassPath(Play.applicationPath + "/tmp/classes"); 
CtClass cls = pool.get(className); 

但我不確定這個版本。它會一直工作嗎?有更好的選擇嗎?

我也試過使用ClassClassPath和LoaderClassPath,但沒有任何成功。

回答

0

通常情況下,除非您編寫插件並需要增強應用程序代碼,否則不應觸摸javassist類。在這種情況下,您將擁有一個MyPluginEnhancer extends play.classloading.enhancers.Enhancer,然後通過調用makeClass(ApplicationClass appClass)方法可以獲得javassist類實例。請參考https://github.com/greenlaw110/play-morphia/blob/master/src/play/modules/morphia/MorphiaEnhancer.java

PS:關於play.classloading.enhancers.Enhancer.makeClass方法實現

/** 
* Construct a javassist CtClass from an application class. 
*/ 
public CtClass makeClass(ApplicationClass applicationClass) throws IOException { 
    return classPool.makeClass(new ByteArrayInputStream(applicationClass.enhancedByteCode)); 
} 

classPool來自下面的代碼:

public Enhancer() { 
    this.classPool = newClassPool(); 
} 

public static ClassPool newClassPool() { 
    ClassPool classPool = new ClassPool(); 
    classPool.appendSystemPath(); 
    classPool.appendClassPath(new LoaderClassPath(Enhancer.class.getClassLoader())); 
    classPool.appendClassPath(new ApplicationClassesClasspath()); 
    return classPool; 
} 
+0

感謝。非常感謝告訴我應該避免使用它;)我需要CtClass從註釋中讀取配置,並且標準java.reflection不能提供我需要的內容。 – sdespolit 2012-03-01 11:47:09