小编典典

使用Javassist创建类并使其可用

java

我要执行以下操作:

try {
    Class.forName("MyClass");
} catch(ClassNotFoundException e) {
    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.makeClass("MyClass");
    Class.forName("MyClass");
}

我已经尝试过了,但是它似乎并不总是可以工作。它在一个上下文中可以工作,但是在另一个上下文中,相同的代码在第二个“ Class.forName(”
MyClass“)”上崩溃了……
cc.toClass()总是调用带来正确的课堂,并尝试过,cc.writeFile()但没有区别。不知何故,在某些情况下,第二个Class.forName找到了该类,而在其他情况下,它只是坏了……我错过了什么吗?


阅读 308

收藏
2020-11-23

共1个答案

小编典典

我发现我的代码是在不同的类加载器上创建类的,具体取决于我从哪里调用它。我通过执行以下操作解决了这个问题:

try {
    Class.forName("MyClass");
} catch(ClassNotFoundException e) {
    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.makeClass("MyClass");
    cc.toClass(this.getClass().getClassLoader(), this.getClass().getProtectionDomain());
    Class.forName("MyClass");
}

toClass使用适当的Classloader
调用该方法确实成功了……我只是不确定如何控制所创建的类将在哪些classloader上可用,但是带有classloader参数的方法完全可以满足我的需求。

2020-11-23