9
votes

Compiler Java code source d'une chaîne?

Y a-t-il un moyen pour un programme Java en cours de compilation de code source Java (transmis comme une chaîne)? XXX

Idéalement, toutes les classes référencées par le code source transbordé seraient résolues. Par le chargeur de classe du programme.

fait quelque chose comme ça existe?


1 commentaires

J'ai trouvé cet exemple, ce dont j'ai besoin exactement. ibm.com/developerworks/java/library/j-jcomp/ index.html


5 Réponses :


9
votes

Bien sûr. Regardez le Javacompiler classe et les autres classes dans le javax.tools package.

Ils ont été autour depuis Java 1.6.

Voici un exemple de code.

(Comme indiqué par @Sergey Tachenov dans les commentaires, il a besoin de JDK pour être installé car le fichier outils nécessaire.jar est livré avec JDK mais pas JRE.)


3 commentaires

Je pense qu'il convient de noter que cela ne fonctionne pas avec le JRE de Sun, il a besoin de JDK pour être installé comme le fichier outils nécessaire.jar est livré avec JDK mais pas JRE.


J'ai essayé cet exemple, j'ai un java.lang.classnotfoundException: test sur classe Clazz = classe.forname ("test"); !


Le répertoire de sortie de la compilation est-il sur le chemin de la classe?



2
votes

dépend de ce que vous voulez faire. Si vous voulez simplement exécuter du code, vous pouvez utiliser Beanshell. Ce n'est pas une classe compilée Java, mais est très utile de faire quelque chose de flexible


0 commentaires

1
votes

Vous pouvez essayer ma bibliothèque JCF Essence qui fait cela. Lors de l'exécution de débogage, vous pouvez avoir la source écrite dans un fichier afin que vous puissiez entrer dans le code. Sinon, tout fait en mémoire. Il enveloppe le javacompiler dans les outils.jar

Il faut une chaîne, compile et le charge dans le chargeur de classe actuelle et renvoie la classe. Il gère des classes imbriquées / intérieures.

http: // vanillajava. blogspot.com/2010/11/more-eux-for-dynamic-code-in-java.html

Remarque: je n'ai pas fonctionné à Osgi. ;)


0 commentaires

1
votes

Javassist peut générer et charger des classes d'exécution et des méthodes à partir de chaînes de code source. Il est également possible de jeter dans le système de fichiers la classe générée si vous en avez besoin.

Il existe actuellement des limitations mineures dans le code que vous pouvez passer dans ces chaînes, par exemple, il ne peut pas inclure des génériques, des énumérations ou de l'autoboxage et de la boîte de réception des primitives. Plus d'informations ici:

http: //www.csg.ci.iu- tokyo.ac.jp/~chiba/javassist/


0 commentaires

4
votes

Ce dont vous avez besoin est une classe qui étend javafileObject xxx

qui peut être utilisé comme suit: xxx


2 commentaires

Où avez-vous déclaré la variable compilationpath ?


Il est plus haut dans le code, juste une corde vraiment