Quelle bibliothèque / quel programme peut être utilisé pour générer du bytecode Java? [fermé]

StackOverflow https://stackoverflow.com/questions/291492

  •  08-07-2019
  •  | 
  •  

Question

Je connais BCEL , mais ce projet semble être mort car il n'a pas encore été mis à jour. deux ans. Et le monde Java avance. Par exemple, JDK 1.6 a un nouveau format de fichier de classe.

Alors, quelle bibliothèque peut être utilisée pour créer du bytecode pour la machine virtuelle Java. Si aucune bibliothèque n'est disponible, un programme est également correct, si je peux manipuler le code généré en détail, par exemple un assembleur de code-octet.

Quel logiciel recommandez-vous? Est-ce facile aussi à utiliser? a de bons exemples / tutoriels?

EDIT: Pour tous ceux qui demandent: oui, le javac va bien. Mais pour générer des classes au moment de l’exécution, un chemin directement en bytecode serait plus propre.

Était-ce utile?

La solution

ASM

http://asm.objectweb.org/

Il est beaucoup plus rapide que BCEL et prend en charge les génériques et les annotations. Un point concernant son architecture: afin d’assurer des performances élevées, ASM est construit autour d’un analyseur qui envoie des événements (contrairement à BCEL dans lequel l’analyseur construit une structure de données). Ceci est un peu similaire à la différence entre les analyseurs SAX et DOM. Il faut un peu de pratique pour s'habituer à ce genre de pensée.

EDIT (suite au commentaire de McDowell): En effet, les visiteurs sont très utilisés dans ASM, mais c’est plus que de simples visiteurs: la structure de données visitées est construite paresseusement par l’analyseur. Par conséquent, si vous n'êtes pas intéressé par certaines parties du fichier de classe ( Par exemple, vous voulez connaître les noms des méthodes mais vous ne vous souciez pas de leur corps), vous pouvez renvoyer une valeur null à partir de la méthode visitMethod (). Ainsi, l’analyseur ignorera les sections de corps de la méthode, empêchant ainsi la construction (coûteuse) du réseau d’objets décrivant complètement la méthode.

Autres conseils

Il existe un exemple assez complet d'utilisation d'ASM pour générer du code octet à partir d'un langage intermédiaire de type Java dans la mise en oeuvre de CAL (langage de type Haskell pour la machine virtuelle Java). Si vous téléchargez les sources sur http://openquark.org/Open_Quark/Download.html alors vous pouvez trouver le code dans AsmJavaByteCodeGenerator.java et les classes de modèle Java dans le même dossier. Le code généré correspond essentiellement à ce que javac ferait, moins les annotations de débogage.

À l'origine, l'implémentation de la CAL utilisait BCEL, mais est passée à ASM, car ASM était nettement plus rapide (probablement d'un ordre de grandeur). De manière tout aussi significative, ASM est thread-safe, de sorte qu'une compilation simultanée est possible, ce qui est nécessaire pour CAL. / p>

Javassiste et cglib sont deux bonnes bibliothèques d'ingénierie en bytecode. Ils sont largement utilisés dans le monde Java EE pour générer des mandataires d'objets au moment de l'exécution. Hibernate et Spring sont deux infrastructures majeures utilisant ces bibliothèques.

http://serp.sourceforge.net/ est une excellente bibliothèque pour plus d'abstraction lors de l'édition du bytecode.

Il existe des technologies comme asm et cglib mais je recommande Javaassist parce que c’est une très bonne bibliothèque pour cela et que vous pouvez trouver des exemples dans le cadre tapestry5 .

Je pense que mon créateur de bytecodes Java préféré s'appelle javac et vous pouvez le trouver sur www.sun.com

Pourquoi ne pas utiliser le compilateur Java, javac? Quel est le problème avec son utilisation pour générer du code octet JVM?

[Sérieusement. Qu'est-ce qui vous empêche de prendre votre source, de créer Java et de le compiler?]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top