2010-07-28 5 views
3

Supposons que j'ai compilé un script Groovy à l'aide de Groovyc, qui a généré un ou plusieurs fichiers .class dans le système de fichiers. A partir d'une application Java, comment ajouter dynamiquement ces classes au classpath pour les charger et appeler leurs méthodes? L'objectif est de pré-compiler les scripts Groovy et de les stocker dans la base de données, afin que l'évaluation puisse être effectuée à partir des versions compilées des scripts.Chargement des classes non présentes dans le chemin de classe

Répondre

9

Vous pouvez créer une instance de URLClassLoader pour charger de nouvelles classes à partir d'un répertoire:

URL dirUrl = new URL("file:/" + "path_to_dir" + "/");    // 1 
URLClassLoader cl = new URLClassLoader(new URL[] {dirUrl}, 
          getClass().class.getClassLoader()); // 2 
Class loadedClass = cl.loadClass("com.xyz.MyClass"); 
MyClass obj = (MyClass) loadedClass.newInstance(); 
obj.doSomething(); 

Ligne 1 crée le URL dans le répertoire où les fichiers .class résident.

La ligne 2 crée une nouvelle instance URLClassLoader. Le premier argument est un tableau d'URL à utiliser comme source. Vous pouvez spécifier plusieurs URL d'annuaire dans le tableau. Le second argument est le classloader qui deviendra le parent de ce nouveau chargeur de classe. Nous passons le classloader de la classe exécutant le code ci-dessus comme argument.

Les classes chargées par un chargeur de classe enfant peuvent accéder aux classes chargées par le chargeur de classes parent.

+0

Cela fonctionne, avec une seule modification sur la ligne 2 parce que dans mon cas, je charge un script Groovy compilé: au lieu de getClass(). Class.getClassLoader() J'utilise le nouveau GroovyClassLoader(). Merci. –

0

Vous devez écrire votre propre classloader.

Ce javadoc link a un exemple de la façon dont vous pouvez en définir un personnalisé.

+0

Cela fonctionne, merci! J'évalue si ce serait la meilleure approche dans le cadre de mon projet. –

Questions connexes