与Javassist创建课程,并提供可用[英] Create class with javassist and make it available

问题描述

我想做以下操作:

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(),但没有区别.不知何故,在某些情况下,第二类.Forname找到了该类,在其他情况下,它只是打破...我是否缺少某些东西?

推荐答案

我发现我的代码是根据我从何处调用的不同类负载器上创建类的代码.我通过执行以下操作解决了这一点:

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");
}

使用适当的classloader调用toClass方法做到了……我只是不确定如何控制创建类的classloader,但是使用ClassLoader参数的方法允许我所处的内容for.

其他推荐答案

`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 Block中.

本文地址:https://www.itbaoku.cn/post/978369.html