[Java]Refactoring

J’ai un soucis avec la méhode “java.lang.Package.getPackages()” avec le jdk 6 de sun sous Ubuntu, voici le code que j’ai utilisé :

[code] public static void main(String… args) {
Package pkgs[];

	pkgs = Package.getPackages();

	for (int i = 0; i < pkgs.length; i++) {
		System.out.println(pkgs[i].getName() + " " + pkgs[i].getImplementationTitle() + " " + pkgs[i].getImplementationVendor() + " "
				+ pkgs[i].getImplementationVersion());
	}
}[/code]

et voici ce qu’il me retourne :

sun.util Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.util Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.net Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.lang.annotation Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.reflect.misc Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.security.provider Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 org.hibiscus null null null sun.net.www.protocol.jar Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.security.action Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.nio.charset Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.io Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.nio Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.net.www Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.lang.ref Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.lang Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.misc Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.net.www.protocol.file Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.util.concurrent Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.util.concurrent.atomic Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.nio.charset.spi Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.nio Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.util.concurrent.locks Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.reflect Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.security Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.lang.reflect Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.nio.cs Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.security.util Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 java.security.cert Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10 sun.jkernel Java Runtime Environment Sun Microsystems, Inc. 1.6.0_10

Il ne me retourne pas les packages javax.swing ou java.util. Et je n’ai actuellement trouvé aucune méthode pour récupérer un objet Package pour ces 2 paquets, quelqu’un aurait-il une idée ?

extrait de la javadoc :

getPackages
public static Package[] [b]getPackages/b Get all the packages currently known for the caller’s ClassLoader instance. Those packages correspond to classes loaded via or accessible by name to that ClassLoader instance. If the caller’s ClassLoader instance is the bootstrap ClassLoader instance, which may be represented by null in some implementations, only packages corresponding to classes loaded by the bootstrap ClassLoader instance will be returned.

Returns:a new array of packages known to the callers ClassLoader instance. An zero length array is returned if none are known.
D’après ce que j’en comprends, si tu ne charges aucune classe de javax.swing, le package n’est pas retourné par getPackages()
en ce qui concerne java.util, il sort ligne 2 de ton résultat

[quote=“molyss, post:2, topic: 49151”]extrait de la javadoc :

getPackages
public static Package[] [b]getPackages/b Get all the packages currently known for the caller’s ClassLoader instance. Those packages correspond to classes loaded via or accessible by name to that ClassLoader instance. If the caller’s ClassLoader instance is the bootstrap ClassLoader instance, which may be represented by null in some implementations, only packages corresponding to classes loaded by the bootstrap ClassLoader instance will be returned.

Returns:a new array of packages known to the callers ClassLoader instance. An zero length array is returned if none are known.
D’après ce que j’en comprends, si tu ne charges aucune classe de javax.swing, le package n’est pas retourné par getPackages()
en ce qui concerne java.util, il sort ligne 2 de ton résultat[/quote]

Merci pour cet extrait que j’avais déjà lu évidemment.

Mon problème c’est que tant qu’une classe n’a pas été chargée par le ClassLoader, son package n’apparait pas. Cependant, après avoir réglé ce problème, j’ai été bloqué par autre chose : il est impossible d’avoir la liste des classes contenues dans un Package. Le plus simple est de partir de l’archive jar (rt.jar) et de rechercher tous les fichiers .class.

Le plus « simple », oui et non : comment sais-tu où se trouve ton rt.jar ? Et qu’est-ce qui te garantit que les classes en question seront toujours dans ce jar-là ?
Si tu veux que ton bidule tourne sur une autre machine que la tienne (mais ce n’est ptêt pas le cas ?), cette solution ne me paraît pas super satisfaisante… mais le besoin m’étant inconnu, l’essentiel m’échappe peut-être :slight_smile:

[quote=“Eviradnus, post:4, topic: 49151”]Le plus “simple”, oui et non : comment sais-tu où se trouve ton rt.jar ? Et qu’est-ce qui te garantit que les classes en question seront toujours dans ce jar-là ?
Si tu veux que ton bidule tourne sur une autre machine que la tienne (mais ce n’est ptêt pas le cas ?), cette solution ne me paraît pas super satisfaisante… mais le besoin m’étant inconnu, l’essentiel m’échappe peut-être :)[/quote]

Le besoin c’était de générer un .xml pour un éditeur UML avec les classes de bases pour quelques packages donc un truc qui s’exécute une unique fois uniquement sur ma machine. Je pense que c’est comme ça qu’Eclipse fonctionne aussi, on lui précise la JVM, il en déduit les .jar de base et scan tous les fichiers .class et les charge avec un URLClassLoader.