1

我正在尝试获取对我的模型类的 CtClass 引用。我从最简单的版本开始, ClassPool.getDefault().get(className);效果很好。但只在我的机器上。它在服务器上不起作用。

无论如何,我认为该版本不应该工作,因为 Playframework 将类存储在 tmp/classses 中。所以现在我完成了这个版本:

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 回答