1

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

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

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

しかし、私はこのバージョンについてはよくわかりません。それは常に機能しますか?より良いオプションはありますか?

ClassClassPathとLoaderClassPathも使用してみましたが、成功しませんでした。

4

1 に答える 1

0

通常、プラグインを作成していてアプリケーション コードを拡張する必要がない限り、javassist クラスには触れないでください。その場合、メソッドMyPluginEnhancer extends play.classloading.enhancers.Enhancerを呼び出して javassist クラスのインスタンスを取得できますmakeClass(ApplicationClass appClass)

実行可能な例については、 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;
}
于 2012-03-01T11:33:58.060 に答える