我正在尝试获取对我的模型类的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但没有任何成功。
答案 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;
}