我想做以下事情:
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找到了这个类,而在其他情况下,它只是打破...我错过了什么?
答案 0 :(得分:3)
我发现我的代码是在不同的类加载器上创建类,这取决于我从哪里调用它。我通过以下方式解决了这个问题:
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
方法可以解决问题......我只是不确定如何控制创建的类可用的类加载器,但带有类加载器参数的方法恰好可以实现正在寻找。
答案 1 :(得分:1)
`try {
Class.forName("MyClass");
} catch(ClassNotFoundException e) {
try {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass("MyClass");
Class.forName("MyClass");
catch(Exception e) {
}
}`
检查此代码,有时jvm优化代码并随机播放语句,try块除外。