我要执行以下操作:
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找到了该类,而在其他情况下,它只是坏了……我错过了什么吗?
cc.toClass()
cc.writeFile()
我发现我的代码是在不同的类加载器上创建类的,具体取决于我从哪里调用它。我通过执行以下操作解决了这个问题:
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参数的方法完全可以满足我的需求。
toClass