2014-10-28 40 views
0

我要做到以下几点:用Javassist创建类,并使其可

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找到类,而在其他情况下,它只是打破...我错过了什么?

回答

2

我发现我的代码是在不同的类加载器上创建类,具体取决于我从哪里调用它。我这样做解决了这个如下:

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
`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块中除外。

+0

那么,第二个尝试块在那里,我只是上传了一个“缩短”版本来显示问题......我注意到cc.toClass()并不总是使用相同的类加载器(这是用于单元测试)。 – Martin 2014-10-28 12:03:57