T
Tomtom
Gast
Hallo
Ich habe folgendes Problem: ich beschäftige mich seit einigen Tagen damit, aus Jar-Archiven die Klassen auszulesen und mir alle deklarierten Methoden auszugeben. Folgender Code funktioniert, sofern das Jar-Archiv folgende Struktur hat:
test.jar:
.
..
Conf2.class
Eine Programmausführung bringt folgende Ausgabe:
Conf2.class
Methode: m_itemread
Methode: configread
Methode: configwrite
...eine korrekte Ausgabe wie ich sie mir wünsche.
Doch sobald sich die Klassen in einem Unterverzeichnis befinden, funktioniert die Methode zum Auslesen der Klassenmethode nicht mehr. Die ausgelesenen Klassen werden aber angezeigt, korrekt inklusive jar-Ordner-Struktur.
Archiv:
jelly.jar
.
..
sunw/demo/jelly/JellyBean.class
Ausgegebener Fehler: java.lang.NoClassDefFoundError: Illegal name: sunw/demo/jelly/JellyBean
Der Quellcode:
Loader.java
System:
Windows XPSP1, JAVA RE 1.4.2, Eclipse 3.0
Wo liegt mein Problem? Auch die direkte Angabe "jar:file:/D:/Test/Test.jar!/sunw/demo/jelly/JellyBean" für meinen "loader" bringt nichts
Viel Danke für Eure Hilfe!
PS: Weder die Java API noch das Forum noch Google konnten mir weiterhelfen.
Ich habe folgendes Problem: ich beschäftige mich seit einigen Tagen damit, aus Jar-Archiven die Klassen auszulesen und mir alle deklarierten Methoden auszugeben. Folgender Code funktioniert, sofern das Jar-Archiv folgende Struktur hat:
test.jar:
.
..
Conf2.class
Eine Programmausführung bringt folgende Ausgabe:
Conf2.class
Methode: m_itemread
Methode: configread
Methode: configwrite
...eine korrekte Ausgabe wie ich sie mir wünsche.
Doch sobald sich die Klassen in einem Unterverzeichnis befinden, funktioniert die Methode zum Auslesen der Klassenmethode nicht mehr. Die ausgelesenen Klassen werden aber angezeigt, korrekt inklusive jar-Ordner-Struktur.
Archiv:
jelly.jar
.
..
sunw/demo/jelly/JellyBean.class
Ausgegebener Fehler: java.lang.NoClassDefFoundError: Illegal name: sunw/demo/jelly/JellyBean
Der Quellcode:
Loader.java
Code:
package beacon;
import java.lang.reflect.Method;
import java.net.*;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.io.File;
public class Loader {
private String[] klassen;
private String[] methoden;
private File archiv;
private String klasse;
private String s;
private int k;
static int p;
public String[] klassenlesen(File f) {
try {
JarFile jar = new JarFile(f);
Enumeration jarcontent = jar.entries();
k =jar.size();
String[] jarObject = new String[k];
klassen = new String[k];
for (int i=0;jarcontent.hasMoreElements();i++) {
jarObject[i]=jarcontent.nextElement().toString();
if (jarObject[i].endsWith(".class")) {
klassen[p]= jarObject[i];
System.out.println(klassen[p]);
p++;
}
}
}
catch (Exception e) {
System.out.println("nix ging "+e.getMessage());
}
return klassen;
}
public Loader(String archive) {
//methode "klassenlesen" wird gestartet, dafür wird das archiv in form des pfadnamens übergeben
archiv = new File("D:\\Test\\Test.jar");
klassen = klassenlesen(archiv);
for (int i=0;i<p;i++) {
try {
//jar-archivename wird hier an classloder übergeben
ClassLoader loader = new URLClassLoader(new URL[] {new URL(archive)});
//das ".class" wird abgeschnitten
String klasse = klassen[i].substring(0,klassen[i].length()-6);
//und die methoden ausgelesen
Class klass = loader.loadClass(klasse);
Method[] m = klass.getDeclaredMethods();
String [] Methoden = new String[m.length];
for (int j=0; j<m.length; j++){
Methoden[j]=m[j].getName();
System.out.println("Methode: "+Methoden[j]);
}
}
catch (Exception e) {
System.out.println("nix ging "+e.getMessage());
}
}
}
public static void main(String[] args) throws Exception {
Loader loader = new Loader("jar:file:/D:/Test/Test.jar!/");
}
}
System:
Windows XPSP1, JAVA RE 1.4.2, Eclipse 3.0
Wo liegt mein Problem? Auch die direkte Angabe "jar:file:/D:/Test/Test.jar!/sunw/demo/jelly/JellyBean" für meinen "loader" bringt nichts
Viel Danke für Eure Hilfe!
PS: Weder die Java API noch das Forum noch Google konnten mir weiterhelfen.