2008-11-14 14 views
15

Je connais le BCEL, mais ce projet semble être mort, puisqu'il n'avait pas de version depuis deux ans. Et le monde Java évolue. Par exemple JDK 1.6 a un nouveau format de fichier de classe.Quelle bibliothèque/programme peut-il être utilisé pour générer le bytecode Java?

Donc quelle bibliothèque peut être utilisée pour créer un bytecode pour la JVM. S'il n'y a pas de bibliothèque, un programme est également bon, si je peux manipuler le code généré en détail, par exemple un bytecode-assembler.

Quels logiciels pouvez-vous recommander? Est-il facile d'utiliser aussi? a de bons exemples/tutoriels?

EDIT: Pour tous les demander: Oui, le javac est bien. Mais pour générer des classes à l'exécution, un chemin directement vers bytecode serait plus propre.

Répondre

19

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 sur son architecture: afin de garantir de hautes performances, ASM est construit autour d'un analyseur qui lance des événements (contrairement à BCEL où l'analyseur construit une structure de données). C'est un peu similaire à la différence entre les analyseurs SAX et DOM. Il faut de la pratique pour s'habituer à ce genre de pensée. EDIT (suite au commentaire de McDowell): En effet, les visiteurs sont largement utilisés dans ASM, mais c'est plus que de simples visiteurs: la structure de données visitée est construite par l'analyseur, donc si vous n'êtes pas intéressé par certaines parties du classfile (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 nulle à partir de la méthode visitMethod(). Ceci fera en sorte que l'analyseur ignore les sections du corps de la méthode, empêchant ainsi la construction (coûteuse) du réseau d'objets décrivant complètement la méthode.

+0

Je pense que par "jette des événements", Itay signifie qu'il utilise le modèle de visiteur. Je suis en train d'essayer l'ASM en ce moment - c'est très bien et a un bon doc. Si vous souhaitez une prise en charge des annotations dans BCEL, vous devez créer les sources les plus récentes. – McDowell

+0

Si vous n'avez pas besoin de performances rapides, ASM fournit également une interface basée sur l'arbre DOM. –

-2

Je pense que mon créateur préféré java bytecode est appelé javac et vous pouvez le trouver à l'adresse www.sun.com

+0

J'ai le sentiment que Mnementh pose une question à propos d'autre chose et nous avons un problème de vocabulaire. – Karl

-3

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

[Sérieusement. Qu'est-ce que vous empêche de prendre la source, ce qui rend Java et compiler?]

+0

Dans certains cas, vous souhaitez générer un bytecode par programme. Si cela se trouve sur l'ordinateur d'un utilisateur, vous ne pouvez pas supposer que le JDK complet est installé. –

+0

Avoir de la difficulté à imaginer une application tellement cool qu'elle nécessite le compilateur, mais pas assez cool pour l'inclure dans le téléchargement. Bien que ce soit techniquement possible, cela semble peu probable. –

+0

Une application courante consiste à compiler des langages autres que le bytecode Java vers Java. Les scripts qui étendent quelque chose comme un jeu ou un éditeur de photos peuvent nécessiter des performances de code compilé. Et, Java 7 est susceptible d'inclure le bytecode qui ne peut pas être produit par un programme Java valide (invokedynamic pour les langages dynamiques). – erickson

2

Javassist et cglib sont deux bonnes bibliothèques d'ingénierie de bytecode. Ils sont largement utilisés dans le monde Java EE pour générer des proxies d'objets lors de l'exécution. Hibernate et Spring sont deux principaux frameworks utilisant ces bibliothèques.

1

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 vous pouvez trouver des exemples dans le cadre tapestry5.

4

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 l'implémentation de CAL (un langage de type Haskell pour la JVM). Si vous téléchargez les sources à 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é est essentiellement ce que javac ferait, moins les annotations de débogage. L'implémentation CAL utilisait à l'origine BCEL mais passait à ASM car ASM était significativement plus rapide (probablement un ordre de grandeur), et tout aussi significatif, ASM est thread-safe, de sorte que la compilation simultanée est possible, ce qui est nécessaire pour CAL.