Question

Je suis en train d'écrire un plugin Eclipse pour soutenir le Frege langage de programmation. J'utilise le IMP méta plate-forme d'outillage et Eclipse Indigo (3.7). L'environnement de temps d'exécution est Java 1.7.

Le plugin utilise le même code que le compilateur par lots pour l'analyse symbolique, l'analyse de la syntaxe, etc. Cependant, je remarquai un comportement différent lorsqu'il est exécuté à partir du plugin Eclipse et tracée vers le bas à la méthode suivante qui lit un fichier de classe d'un précédemment module compilé pour obtenir méta-informations qui y sont stockées sous forme d'annotations java:

public static MD.Operator[] getOperators(ClassLoader loader, String pack) 
                                              throws ClassNotFoundException {
    Class<?> cl = null;
    cl = loader.loadClass(pack);
    MD.FregePackage os = cl.getAnnotation(MD.FregePackage.class);
    if (os == null) return null;        // <-- no annotation present
    return os.ops();
}    

Notez que le code crée sa propre instance d'un URLClassLoader, qui est passé comme argument. Si je ne mets pas correctement le chemin de la classe, la méthode getOperators jette correctement ClassNotFoundException, donc je pense que je peux être sûr qu'il charge la classe. Un message de trace me dit que le chargeur de classe est construit avec le chemin suivant (qui est juste le chemin de classe par défaut):

mkClassLoader:[C:\opt\eclipse\plugins\org.eclipse.equinox.launcher_1.2.0.v20110502.jar, X:\dev\frege\build]

Parce qu'un fichier de classe n'a pas été créé par le compilateur Frege ne peut pas normalement avoir l'annotation MD.FregePackage cela indique généralement que l'utilisateur a essayé d'importer une classe java simple, et même je reçois le message suivant dans le plug-in:

X:/dev/runtime-EclipseApplication/TestJFrege/src/Neu.fr:1: `frege.prelude.Base` is not a frege package

Et pourtant, à partir de la ligne de commande, je peux compiler ce bien. J'inclus cette ici comme preuve que les annotations en question peuvent en effet être chargés à partir du même endroit:

X:\dev\frege>java -cp ./build frege.compiler.Main X:/dev/runtimeEclipseApplication/TestJFrege/src/Neu.fr
mkClassLoader: [./build]
running: javac -cp ./build -d . -encoding UTF-8 ./Neu.java

Reprise des faits:

  1. Le code qui est censé charger les annotations fonctionne bien lorsque le compilateur est appelé via l'interface de ligne de commande.
  2. Le code qui est censé charger les annotations ne sait pas si elle est invoquée à partir du plug-in ou la ligne de commande. En fait, le plug-in n'existait même pas jusqu'à la semaine dernière, tandis que l'interface de ligne de commande utilisée pour le travail bien pendant des mois.
  3. Les annotations ont, bien sûr, sinon RetentionPolicy.RUNTIME la compilation de ligne de commande ne les reconnaîtraient soit. Mais il ne proovably.

La seule conclusion que je peux tirer est que Class.getAnnotation() est en quelque sorte ne fonctionne pas correctement. Ceci est très regrettable, car cela détruit efficacement les fonctionnalités de base que j'ai besoin pour le système de module.

Si cette question est importante de toute façon: le code du compilateur Frege les utilisations du plugin est lui-même écrit en Frege et la classe frege.prelude.Base mentionné ci-dessus est une bibliothèque de base qui est nécessaire par chaque module, par conséquent, il doit déjà avoir été chargé sur l'activation du plug-in, mais bien sûr avec un chargeur de classes différentes.

Quelqu'un at-il des expériences similaires? Est-il possible de résoudre ce problème et comment? Toute suggestion comment contourner ce sont les bienvenus.

Était-ce utile?

La solution

était la classe MD.FregePackage chargé par le classloader utilisé dans votre méthode? Peut-être essayer de charger une première que, depuis deux classes ne sont pas equal() si elles ont été chargées par des chargeurs de classe. Cela pourrait expliquer pourquoi il n'est pas trouvé.

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