2012-03-01 6 views
1

私のモデルクラスへのCtClass参照を取得しようとしています。私は最も簡単なバージョン ClassPool.getDefault().get(className);で始まり、うまくいきました。しかし、私のマシンでのみ。サーバー上では動作しません。playframeworkでjavassistクラスを取得する

とにかく、Playframeworkはクラスをtmp/classに保存しているので、バージョンは機能しないはずです。だから今私はこのバージョンで完了:

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を参照してください。

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

ありがとう:

PS:classPoolは、次のコードから来について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)); } 

。まあ、私はそれを使用する必要はありませんと言っていただきありがとうございます;)注釈から構成を読み取るためにCtClassが必要で、標準のjava.reflectionは必要なものを提供しません。 – sdespolit

関連する問題