Javassist горячей замены не найдет класс

Я пытаюсь использовать Javassist в первый раз, и я застрял. У меня есть класс под названием стандарт в пакете по умолчанию. Я пытаюсь перезагрузить его с помощью 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)

Я запускаю jvm с этими аргументами

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

Странная часть в том, что класс загружается просто отлично.

1 ответ

Решение

Странная часть в том, что класс загружается просто отлично.

Вы, вероятно, говорите о 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 класс был загружен, следовательно, может быть перезагружен.

Другие вопросы по тегам