使用playframework获取javassist类

时间:2012-03-01 09:37:57

标签: java reflection playframework javassist

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

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

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

但我不确定这个版本。它会一直有效吗?有更好的选择吗?

我也尝试过使用ClassClassPath和LoaderClassPath但没有任何成功。

1 个答案:

答案 0 :(得分: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;
}