0 votes

Créer une instance de classe en java au moment de l'exécution.

Dans mon programme, je génère des classes de façon dynamique mais lorsque j'essaie :

String[] args = {"-d","D:\\path\\build\\classes","-s","D:\\path\\src","http://services.aonaware.com/DictService/DictService.asmx?WSDL"};
WsImport.doMain(args);
URL url = new URL("file:D:/path/build/classes/com/aonaware/services/webservices/");
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});
Class service = Class.forName("com.MyClass",true,urlClassLoader );

Je reçois java.lang.ClassNotFoundException

Si j'exécute une fois de plus le programme (dans Eclipse), alors il fonctionne. En fait, il suffit de rafraîchir le projet dans Eclipse pour qu'il fonctionne.

Quelqu'un voit-il le problème

2voto

Péter Török Points 72981

On dirait un problème de classpath. Assurez-vous que la classe en question (ou le jar qui la contient) est compilée et se trouve dans le classpath.

Qu'entendez-vous exactement par "générer des classes de manière dynamique" ? Si vous générez le fichier source java d'une classe, il doit d'abord être compilé dans un fichier de classe, avant que le chargeur de classe puisse le récupérer. Peut-être qu'Eclipse fait cela au deuxième tour, c'est pourquoi cela fonctionne alors.

1voto

McDowell Points 62645

Vous utiliserez généralement un ClassLoader como URLClassLoader pour charger les classes dynamiquement au moment de l'exécution.

0voto

Tim Bender Points 11611

Utilisez la forme à trois arguments de Class.forName() qui vous oblige à spécifier le ClassLoader. [Lien vers l'API Java][1]

[1] : [http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String](http://java.sun.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String) , boolean, java.lang.ClassLoader)

0voto

Robert Petermeier Points 2183

Lire l'article documents sur URLClassLoader : Toute URL qui se termine par un '/' est supposée faire référence à un répertoire.

De plus, vous devriez probablement utiliser '/' comme séparateur au lieu de \\ .

Addendum :

Eh bien, votre code fonctionne parfaitement pour moi - s'il y a des classes Java compilées réelles dans le répertoire spécifié en tant qu'URL. Mais lorsque vous dites

Dans mon programme, je génère des classes dynamiquement

générez-vous directement le code source ou le bytecode de Java ? S'il s'agit de code source, le compilez-vous également à partir de votre application ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X