Ich versuche, eine Java-.class-Datei dynamisch zu laden und durch Reflektion aufzurufen.Java Classloading läuft extrem langsam?
Ich habe eine Klasse namens Foo; Es hat einen leeren Konstruktor und hat eine Methode namens doit(), die ein String-Argument annimmt und einen String zurückgibt. Außerdem kehrt es die Zeichenfolge um.
Hier ist mein Code:
URL url = new URL("file://C:/jtest/");
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> cl = loader.loadClass("Foo");
Constructor<?> cons = cl.getConstructor((Class[])null);
Object ins = cons.newInstance(new Object[]{});
Method meth = cl.getDeclaredMethod("doit", String.class);
Object ret = meth.invoke(ins, new Object[]{"!dlroW olleH"});
System.out.println((String)ret);
Da diesen Druck erwartet "Hallo Welt!". Es dauert jedoch etwa 30 Sekunden abzuschließen. Ich weiß, Reflexion ist langsam, aber ich erwarte, dass es 10 ms oder so ist.
Ich benutze Eclipse mit JRE 1.6.0_13, und ich verwende Windows Vista.
Was mache ich hier falsch?
Danke.
Bearbeiten: Ich habe den Code profiliert, und alle seine Zeit wird in der dritten Zeile (loadClass()) verwendet. Alles andere passiert sofort.
Edit: Ich habe den Code in eine Schleife gesetzt; Die langsame Funktion wird irgendwie optimiert und dauert nur 30 Sekunden in der ersten Schleife.
Bearbeiten: Ich habe die Lösung gefunden.
Statt:
URL url = new URL("file://C:/jtest/");
habe ich es zu:
URL url = new URL("file:/C:/jtest/");
Jetzt funktioniert es perfekt. Ich weiß nicht, warum es funktioniert, aber ich sehe nicht, wie ich (und 5 andere Leute) das übersehen hätte. Jetzt fühle ich mich dumm ..
loadClass überprüft zuerst den Cache, um zu sehen, ob die Klasse bereits geladen ist, wenn ich mich richtig erinnere. Das würde erklären, warum es bei der zweiten Iteration nicht lange dauert. –
Ist das echte "Foo" in einem Paket? Das Laden aus dem Standardpaket (kein Paket) kann seltsame Auswirkungen haben. Versuche, zu foo.Foo zu wechseln. – flicken
Das ist interessant ... neue URL ("file:/C:/jtest /"). GetPath() ist/C:/jtest /. Ich frage mich, wie URLClassLoader das interpretiert. –