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

Je voudrais créer une nouvelle instance de classe à partir du tableau bytes. Comment puis-je faire cela? Est-ce possible?Java: nouvelle instance du bytecode

+1

duplication possible de [Java: Comment charger la classe stockée comme octet \ [\] dans la JVM?] (Http://stackoverflow.com/questions/1781091/java-how-to-load-class-stored- comme-octet-dans-le-jvm) –

+0

@bruno conde: Il ressemble. Nous exprimons simplement les choses de manière plus concise ici –

+0

Vous pouvez utiliser defineClass, cependant à moins d'utiliser un chargeur de classe personnalisé, vous devrez peut-être utiliser des réflexions pour l'appeler comme n'étant pas une méthode publique. –

Répondre

8
+1

Belle réponse mais formatage affreux et un lien java 1.4. Changé les deux. –

+0

merci pour l'édition, luttait avec cela, mais l'analyseur ne voulait pas montrer le lien correctement. –

+3

+1. Quoi qu'il en soit, la méthode est protégée, vous aurez donc besoin d'un moyen d'y accéder. Étendre le ClassLoader et fournir une méthode publique pourrait être une solution. –

2

Ceci est possible, et vous devez utiliser la réflexion pour y parvenir. Le code de pseudo est:

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

Je suis assez sûr que la partie 'loadIntoCurrentClassLoader (bytes)' est ce que la question est sur :-) –

+0

Ok, donc je suis allé un peu à la mer;) –

+0

Il est ambigu de la façon dont la question est formulée. –

0

Je peux créer la classe en développant ClassLoader et en utilisant defineClass. Mais alors la classe créée a mon ClassLoader étendu en tant que ClassLoader, ce qui provoque des échecs lorsque le code de ma classe charge d'autres classes. Vraisemblablement, je peux contourner ce problème en créant mon ClassLoader pour tout déléguer de la bonne manière, mais ce n'est pas évident de savoir comment le faire.