Javassist热交换找不到类



我第一次尝试使用Javassist,结果被卡住了。我在默认包中有一个名为standard的类。我正在尝试使用HotSwapper重新加载它。我试过这个,但不起作用。

public static void main(String[] args) throws Exception
{
    ClassPool pool = ClassPool.getDefault();
    CtClass clazz = pool.get("Standard");
    HotSwapper swap = new HotSwapper(8000);
    swap.reload("Standard", clazz.toBytecode());
}

这是我得到的错误

Exception in thread "main" java.lang.RuntimeException: no such class: Standard
at javassist.util.HotSwapper.toRefType(HotSwapper.java:189)
at javassist.util.HotSwapper.reload(HotSwapper.java:157)
at JavaHacks.main(JavaHacks.java:15)

我正在用这些args 启动jvm

agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000

奇怪的是,它很好地加载了类。

奇怪的是,它很好地加载了类。

您可能在谈论Javassist,但Javassist可以读取类文件这一事实并不意味着类是由JVM类加载的。

您应该将代码更改为:

public static void main(String[] args) throws Exception {
    // Ensure Standard class classloading by creating an instance 
    // (calling a static method like Standard.init() would also do)
    Standard standard = new Standard();
    standard.doSomething();
    ClassPool pool = ClassPool.getDefault();
    CtClass clazz = pool.get("Standard");
    HotSwapper swap = new HotSwapper(8000);
    swap.reload("Standard", clazz.toBytecode());
}

这将确保Standard类已被类加载,因此可以重新加载。

最新更新