2010-11-23 3 views
7
ClassWriter cw = new ClassWriter(...); 
byte[] bytes = cw.toByteArray(); 

Я хотел бы создать новый экземпляр класса из массива bytes. Как мне это сделать? Это вообще возможно?Java: новый экземпляр from bytecode

+1

Возможный дубликат [Java: Как загрузить класс, хранящийся в байтах \ [\] в JVM?] (Http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- as-byte-in-the-jvm) – 2010-11-23 17:44:33

+0

@bruno conde: Похоже. Мы просто выражаем это более кратко: – 2010-11-23 17:54:42

+0

Вы можете использовать defineClass, однако, если вы не используете пользовательский загрузчик классов, вам может понадобиться использовать отражения, чтобы назвать его не общедоступным. – 2010-11-23 22:39:50

ответ

2

Это возможно, и вы должны использовать Reflection для того, чтобы достичь этого. Код псевдео:

final Class clazz = loadIntoCurrentClassLoader(bytes); //I'm assuming you wrote this already using defineClass 

final YourClass foo ; 
try { 
    foo = (YourClass) clazz.newInstance(); 
} 
catch (final Exception e) { 
    throw new RuntimeException(e); 
} 
0

Я могу создать класс, расширив ClassLoader и используя defineClass. Но тогда созданный класс имеет мой расширенный ClassLoader как его классLoader, который вызывает сбои, когда код моего класса загружает другие классы. Предположительно, я могу обойти это, создав свой ClassLoader, чтобы делегировать все правильно, но не очевидно, как это сделать правильно.