Использовать класс из байтового массива без отражения? - PullRequest
0 голосов
/ 04 декабря 2010

Я инструктировал свой класс, используя ASM, и обработал его следующим образом

public class MyClassLoader extends ClassLoader {
...
    byte[] classBytes = ... //the class is of type com.mypackage.Test
    Class clazz = defineClass("com.mypackage.Test", classBytes, 0, classBytes.length);
    resolveClass(clazz);
    com.mypackage.Test test =(com.mypackage.Test) clazz.newInstance();

Однако я получаю ClassCastException в последней строке:

java.lang.ClassCastException: com.mypackage.Test cannot be cast to com.mypackage.Test

Обходной путь должен использовать отражение:

Object test = clazz.newInstance();
test.getClass().getMethods()[0].invoke(test, null); //invoke some method - successfully

Я использую неправильный загрузчик классов или что-то в этом роде?

1 Ответ

5 голосов
/ 04 декабря 2010

Class.newInstance является рефлексивным вызовом.

Как правило, в этих ситуациях вы должны сделать так, чтобы загрузчик классов был потомком загрузчика классов, который загрузил существующий код. Пусть класс реализации реализует интерфейс из загрузчика классов вашего кода. Используйте Class.asSubclass так, чтобы Class был известным подтипом вашего интерфейса. Создайте экземпляр класса реализации через Class.getConstructor.newInstance.

Используя эту технику, вы не зависите от использования отражения, чтобы выбрать метод, хотя для этого нужен конструктор без аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...