gpt4 book ai didi

java - 使用 playframework 获取 javassist 类

转载 作者:行者123 更新时间:2023-12-01 05:27:29 25 4
gpt4 key购买 nike

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

最佳答案

通常你不应该接触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;
}

关于java - 使用 playframework 获取 javassist 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9513762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com