Создать класс с 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 метод с правильным Classloader сделал свое дело... Я просто не был уверен, как контролировать загрузчик классов, когда созданный класс станет доступным, но метод с параметрами classloader позволяет именно то, что я искал.

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

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