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

我想從bytes數組中創建新的類實例。我該怎麼做呢?它有可能嗎?Java:來自字節碼的新實例

+1

[Java:如何將類存儲爲字節\ [\]到JVM中?](http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- as-byte-into-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

這是可能的,你需要使用反射,以實現這一目標。僞代碼是:

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作爲其ClassLoader,當我的類的代碼加載其他類時導致失敗。據推測,我可以通過創建我的ClassLoader來以正確的方式委託所有內容來解決這個問題,但不清楚如何正確使用它。