2014-10-28 3 views
0

я хочу сделать следующее:Создать класс с 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(), но это не имеет значения. Так или иначе, в некоторых случаях второй класс.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 позволяет точно, что я искал.

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

+0

Ну, второй блок try есть, я просто загрузил «сокращенную» версию, чтобы показать проблему ... Что я заметил, так это то, что cc.toClass() не всегда использовал один и тот же загрузчик классов (это для unittesting). – Martin

 Смежные вопросы

  • Нет связанных вопросов^_^