我是第一次尝试使用 Javassist,但我被卡住了。我在默认包中有一个名为 standard 的类。我正在尝试使用 HotSwaper 重新加载它。我已经尝试过,但它不起作用。
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)
我正在使用这些参数启动 jvm
agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
奇怪的是它加载类很好。
最佳答案
The weird part is it loads the class just fine.
您可能正在谈论 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
类已被类加载,因此可以重新加载。
关于Javassist 热交换程序未找到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17251707/