loadClass() peut-t-elle charger un class file enhanced ?
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:
Code:
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 le jar myJAR.jar contient des classes persistentes j'obtient l'exception suivante :
Citation:
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)
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.
Merci d'avance.