Bonjour,
J'ai un petit problème avec la méthode loadClass (API de reflection) auquel je trouve pas de solution dans les FAQ et tutoriels :
Pour décrire le contexte : j'ai besoin de charger des classes dynamiquement à partir d'un jar, j'utilise donc la méthode loadClass pour charger mes class file lu à partir de mon jar.
le code suivant est parfaitement fonctionnel si je lui donne un jar contenant des class file non enhanced (je parle içi de JDO enhancement). Mon problème est que j'ai besoin de charger des classes persistentes donc le byte code lu par la méthode loadClass(String nomclasse) est dans ce cas enhanced (modifié pour assurer la persistence).
code:si le jar myJAR.jar contient des classes persistentes j'obtient l'exception suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 import java.io.File; import java.io.IOException; import java.util.Enumeration; import java.lang.reflect.Field; import java.util.jar.*; public class myCLASS { public void load() { JarFile jarFile = null; try { jarFile = new JarFile("lib/myJAR.jar"); try { String jarName = jarFile.getName();System.out.println("jarName = " + jarName); String jarFolder = jarName.substring(0, jarName.lastIndexOf(File.separator));System.out.println("jarFolder = " + jarFolder); // get the list of the jar file entries Enumeration enumeration = jarFile.entries(); int i = 0; byte[] classData = null; while (enumeration.hasMoreElements()) { String elementName = enumeration.nextElement().toString(); // Pour chaque élément on récupère l'objet JarEntry correspondant JarEntry entry = jarFile.getJarEntry(elementName);System.out.println(elementName); String namebegin=null,name=null,nameEnd=null; //ne s'intéresser que des fichiers .class if(elementName.lastIndexOf('.')>0) { namebegin=elementName.substring(0,elementName.lastIndexOf('.')); name=namebegin.replace('/','.');System.out.println("***********************"+name+"************************"); nameEnd=elementName.substring(elementName.lastIndexOf('.')); } if (!entry.isDirectory()&& nameEnd.equals(".class")) { int size=(int) entry.getSize(); System.out.println(size); Class<?> c=this.getClass().getClassLoader().loadClass(name); Field f[]= c.getDeclaredFields(); for(Field g:f) {System.out.println("--------------"+g+"----------------------");} } i++; } // fin while(enumeration) } finally { // Fermeture du JarFile jarFile.close(); } } catch (Exception e) { e.printStackTrace(); } } public static void main (String args []){ finale f=new finale(); f.load(); } }
Si quelqu'un a une solution pour résoudre ce problème ou s'il voit une autre cause de cette exception qu'il n'hésite pas. Je suis prête à fournir plus de description à mon problème.Exception in thread "main" java.lang.NoClassDefFoundError: javax/jdo/spi/PersistenceCapable
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at finale.load(finale.java:49)
at finale.main(finale.java:69)
Merci d'avance.
Partager