Создать класс с 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.