ClassWriter cw = new ClassWriter(...);
byte[] bytes = cw.toByteArray();
Я хотел бы создать новый экземпляр класса из массива bytes
. Как мне это сделать? Это вообще возможно?Java: новый экземпляр from bytecode
ClassWriter cw = new ClassWriter(...);
byte[] bytes = cw.toByteArray();
Я хотел бы создать новый экземпляр класса из массива bytes
. Как мне это сделать? Это вообще возможно?Java: новый экземпляр from bytecode
Это возможно, и вы должны использовать 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);
}
Я могу создать класс, расширив ClassLoader и используя defineClass. Но тогда созданный класс имеет мой расширенный ClassLoader как его классLoader, который вызывает сбои, когда код моего класса загружает другие классы. Предположительно, я могу обойти это, создав свой ClassLoader, чтобы делегировать все правильно, но не очевидно, как это сделать правильно.
Возможный дубликат [Java: Как загрузить класс, хранящийся в байтах \ [\] в JVM?] (Http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- as-byte-in-the-jvm) – 2010-11-23 17:44:33
@bruno conde: Похоже. Мы просто выражаем это более кратко: – 2010-11-23 17:54:42
Вы можете использовать defineClass, однако, если вы не используете пользовательский загрузчик классов, вам может понадобиться использовать отражения, чтобы назвать его не общедоступным. – 2010-11-23 22:39:50