.class-Datei in Javaprogrammierung einfügen

HADDUNG

Grünschnabel
HalliHallo zusammen!

Ich hoffe der Titel ist nicht zu verwirrend, aber ich werde es einfach versuchen zu erklären.
Ich beschäftige mich gerade mit der Programmierung eines PlugIns für JUnitTests.
Der Teil der mir Probleme macht, ist das "Einlesen" einer .class-Datei. Nicht den Inhalt sondern wikrlich das "Einfügen".
Hier erstmal den Codeteil um des es geht:

Java:
JUnitCore core = new JUnitCore();
RunListener listener = new RunListener();
core.addListener(listener);

Danach soll mit der Methode core.run(Class clazz) der eigentliche Testlauf getstartet werden. Hierfür benötige ich als Parameter ein .class Datei! Wenn ich diese einfach per Hand reinschreibe funktioniert auch alles super, bringt mir natürlich für den richtigen Einsatz nichts...
Deshalb habe ich versucht diese gefolgt einzulesen ("TestTest.class" soll hier dem Namen des Tests entsprechen):

Java:
	private Class createClass() throws Exception
	{
		Class result;
		
		URI uri = new File(System.getProperty("user.dir")).toURI();
		URL url = uri.toURL();
		URLClassLoader urlClassLoader = new URLClassLoader( new URL[]{ url } );
		result = urlClassLoader.loadClass("TestTest.class");

		return result;
	}

Leider folgt diese Fehlermeldung:

java.lang.ClassNotFoundException: TestTest.class
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 java.lang.ClassLoader.loadClass(Unknown Source)

Es funktioniert also das Laden der class-Datei nicht. Eigentlich müsste es meiner Meinung nach passen (tut es aber ja nicht^^).


Würde mich sehr freuen, wenn jemand eine Idee hätte! Danke schonmal!
Beste Grüße, Kai
 
Da kann ich dir schnell helfen. Du musst einfach nur das .class weglassen. Dann funktioniert alles.
Liegt daran, dass der ClassLoader nicht nach einer Datei, sondern wirklich nach einer Klasse sucht. Wenn der URL-ClassLoader also den richtigen Pfad hat, kannst du auch z.B. java.lang.String laden.

MfG Technoblade
 
lass dir doch mal die URL von this.class.getResource("/paket/zum/klass/file/TestTest.class") ausgeben. Dies sollte funktionieren, wenn eine TestTest.class im Paket paket.zum.klass.file liegt. Diese Methode arbeitet intern mit dem Classloader und sollte dir damit genauere Ergebnisse zum Debuggen geben. Wichtig ist der Pfad, ohne ihn geht es nicht.
 
Gerngeschehen :),

sehe gerade, dass das hier dein erster Beitrag ist, dann nochmal herzlich Willkommen im Namen aller. Den Danke-Button hast du ja anscheind schon gefunden, das freut mich :).
Wenn du es ganz sauber machen willst kennzeichnest du das Thema auch noch als erledigt indem du unten neben "Auf Thema antworten" auf das Häkchen klickst.

Schönen Abend noch.
 
Hi!

Ist es jetzt aber doch noch nicht... schade!
Jetzt kommt folgender Fehler:

java.lang.NoClassDefFoundError: TestTest (wrong name: interfaces/TestTest)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
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 java.lang.ClassLoader.loadClass(Unknown Source)
at interfaces.Runner.createClass(Runner.java:61)
at interfaces.Runner.runTest(Runner.java:35)
at interfaces.Runner.<init>(Runner.java:18)
at interfaces.RunnerTestManual.RunnerTestRight(RunnerTestManual.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Irgendwelche Ideen? :)
 
in ein System.out.println();

Vielleicht kannst du weitere Informationen über den Speicherort herausfinden. Oder einfach mal ein bisschen durchprobieren.

Problem ist aber doch, dass irgendwas mit dem ClassLoader nicht stimmt, deswegen kann ich ja auch nichts von der Klasse aufrufen. Oder versteh ich dich falsch?

Wenn ich mir den Ordner auslese passts soweit eigentlich:
C:\Users\HADDE\workspace\uTest\src\interfaces\TestTest.class (Datei)

und meine url ist:
file:/C:/Users/HADDE/workspace/uTest/src/interfaces/ und mein Dateiname: TestTest


Kann es mit den Slashes zu tun haben?


Grüße!
 
Ja, Backslashes musst du escapen. Um C:\WINDOWS\system32 im Java-Quellcode korrekt anzugeben, musst du "C:\\WINDOWS\\system32" schreiben. Wenn du die mit der CMD eingibst, sollte das aber kein Problem sein. Ist das hier:
Wenn ich mir den Ordner auslese passts soweit eigentlich:
C:\Users\HADDE\workspace\uTest\src\interfaces\TestTest.class (Datei)

und meine url ist:
file:/C:/Users/HADDE/workspace/uTest/src/interfaces/ und mein Dateiname: TestTest
Wenn die Pfade aus deiner Ausgabe stammen, sollte es eigentlich richtig sein.

Wenn du willst, kannst du ja mal Procmon von der Sysinternals Suite darüber laufen lassen: http://technet.microsoft.com/de-de/sysinternals

Diese Sysinternals-Suite ist übrigens das einzige, was ich bei Linux wirklich vermisse....
 

Neue Beiträge

Zurück