Classloader ohne Package

  • Themenstarter Themenstarter Dr.Classloader
  • Beginndatum Beginndatum
D

Dr.Classloader

Gast
Hallo,

ich versuche gerade eine während der Laufzeit kompillierte class-Datei mit dem Classloader zu laden.

Leider wird bei folgendem Code immer eine "ClassNotFoundException" geworfen.


Java:
			cl = new URLClassLoader(new URL[] { file.toURI().toURL() });
			Class<?> c = cl.loadClass(packageName + className);// +file.getName());
file ist eine gültige ".class-File" und in className steht der passende Klassenname drin (ohne .class)

wobei
Java:
packageName = ""
weil die Klasse kein Package hat. Muss da dann vielleicht was anderes vor?
Zuvor hatte ich mit dieser Methode bereits vor laufzeit Kompilierte Klassen mit einem Package geladen, was auch Funktioniert hat (Natürlich stand in packageName enstprechendes drin).

Wäre toll wenn mir jemand helfen könnte!

Viele grüße
 
mich würde mal viel mehr interessieren auf was "file" zeigt ...
deinem kommentar zu folge nämlich direkt auf das CLASS-File selbst ... und ich denke genau das wird der fehler sein ...
versuche einfach mal nur auf das verzeichnis in dem das file liegt zu zeigen ... also "file.getParentFile()" falls in "file" direkt das class-file selbst steht ...

was natürlich auch geht vorher in ein JAR packen und dann "file" auf das JAR zeigen lassen ...

aber ich denke direkt auf das CLASS-File wird wohl nicht gehen ...
 
Hi,

vielen Dank für die Antwort erstmal!

file zeigt tatsächlich auf die CLASS-File selbst, aber das ist in Ordnung.
Vorher hats auch so geklappt.

Die Exception wird ausserdem durch diese Zeile hervorgerufen:
Java:
            Class<?> c = cl.loadClass(packageName + className);// +file.getName());
Die Klasse wird nicht gefunden, deshalb nehme ich an das der String den ich übergebe nicht Richtig ist.
Kann es vielleicht sein, das vor der "className" noch etwas stehen muss, sozusagen um anzuzeigen, dass die Klasse in keinem Package ist?
Hab dazu leider nichts finden können.
 
Man kann keine Klassen aus dem Default Package importieren von Klassen aus die selber nicht im Default Package liegen, scheint wohl auch für Classloader zu gelten.
 
Oh, das ist Schlecht.

Die Datei, die ja wie gesagt zur laufzweit kompiliert wird, liegt in einem Externen Verzeichnis, denn der Benutzer soll den Code manipulieren können.
Gibt es denn dann trotzdem eine möglichkeit, diese Klasse in ein Package zu packen?

Oder wie könnte man hier vorgehen?

Vielen Dank für die Antworten bisher auf jeden Fall schonmal!
 
Ok, aber die CLASS-File liegt ja dann im Falschen Ordner, deshalb wird es nicht funktionieren.
Naja notfalls muss ich die Datei dann halt in ein internes Verzeichnis verschieben oder kopieren.

Hatte aber gehofft das es eine schönere Lösung gibt.

Trotzdem vielen Dank
 
ich frag mich bei sowas immer wieder : WELCHER SINN STECKT DAHINTER ? warum source-files vom user bearbeiten lassen und diese dann compilen und sich mit solchen problemen rumärgern anstatt ein ordentliches modular-system zu nutzen was standardisierte schnittstellen hat ...

irgendwie für mich ziemlich sinn-endfremdet und eher in richtung proof-of-concept ...

wie gesagt : ich vermute das es auch unter anderem daran liegt das "file" halt direkt auf das class-file zeigt ... ausprobieren muss ichs aber jetzt auch nicht ...
und das andere was gesagt wurde das man keine klasse laden können soll die in keinem package steckt ... hmm .. für mich auch nicht wirklich sinnvoll ... obwohl man natürlich immer packages nutzen sollte ... alleine der gliederung wegen ...


ich werd mir das ganze mal in ner test-umgebung ansehen
 
also ich weis echt nich was euer problem ist ...

simpler aufbau

java
-> Loader.java
-> test
-> Test.java

source
Java:
import java.io.*;
import java.net.*;
public class Loader
{
	public static void main(String[] args) throws Exception
	{
		URLClassLoader loader=new URLClassLoader(new URL[] { (new File("test")).toURI().toURL() });
		Class<?> clazz=loader.loadClass("Test");
		Object instance=clazz.newInstance();
	}
}
Java:
public class Test
{
	static
	{
		System.out.println("Test loaded");
	}
	public Test()
	{
		System.out.println("Test constructed");
	}
}

und es ist völlig egal ob ich in zeile 7 nur den ordner "test" angeben oder direkt das classfile "test\Test.class" ...
ich erhalte immer folgende ausgabe

Code:
Test loaded
Test constructed


ergo : die idee funktioniert ... kann also nur an der klasse liegen die versucht wird zu laden
 
Besten Dank, dass du dir die Arbeit gemacht hast.
Hab jetzt nochmal ein bisschen rumprobiert und offenbar ist es so, dass die Klasse nur geladen wird, wenn Sie in dem "bin" Ordner liegt.

Es funktioniert also nicht in meinem Externen Verzeichnis.
Wird mir also wahrscheinlich nichts anderes Übrig bleiben, als die Datei zu verschieben.
 
Besten Dank, dass du dir die Arbeit gemacht hast.
Hab jetzt nochmal ein bisschen rumprobiert und offenbar ist es so, dass die Klasse nur geladen wird, wenn Sie in dem "bin" Ordner liegt.

Es funktioniert also nicht in meinem Externen Verzeichnis.
Wird mir also wahrscheinlich nichts anderes Übrig bleiben, als die Datei zu verschieben.

glaub ich erlich gesagt nicht ... ich hab ja gezeigt das es geht ...

mir fallen jetzt aber eher zwei andere dinge ins auge :

1) ist die klasse so überhaupt compile-fähig wie sie der user schreibt ?
2) wird das source-file denn auch überhaupt compiled ?

weil ein source-file ".java" kannst du natürlich NICHT über einen classloader laden ...
 

Zurück
Oben