Reflection - wie kann ich eine Methode benutzen

y0dA

Erfahrenes Mitglied
Hi!
Ich versuche gerade ein externes Jar nachzuladen, nachladen dürfte funktionieren, jedoch gibt es wohl Verständnisprobleme wie ich nun eine Methode einer nachgeladenen Klasse benutzen kann.

Code:
public void loadExternalLibary() {
		try {
			URL jarURL = new File(this.path + this.jar).toURL();
			ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
			
			if (classLoader != null && (classLoader instanceof URLClassLoader)) {
				URLClassLoader urlClassLoader = (URLClassLoader) classLoader;
				 Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
				 addURL.setAccessible(true);
				 addURL.invoke(urlClassLoader, new Object[]{jarURL});
				 
				 Class tempClass = classLoader.loadClass(this.className);
				 /* check if class really implements needed interface */
				 Class[] interfaceArray = tempClass.getInterfaces();
				 for (int i = 0; i < interfaceArray.length; i++) {
					 if (interfaceArray[i].equals(ITrackParser.class)) {
						 /* external class implements needed interface */
						 this.c = tempClass;
						 break;
					 }
				 }
				 if (this.c == null) {
					 throw new Exception("external class " + this.className + " does not implement needed "
							 + ITrackParser.class);
				 }	
				 
				 final String hh =
						"C:\\work\\projects\\StreetDetection\\src\\main\\resources\\files\\20071207_1sekunde.LOG";
				 
				 Class[] parameterTypes = new Class[] {String.class};
				 Method m = this.c.getMethod("getReceiverId");
				 String ss = (String) m.invoke(this.c);

			}
Hier bekomme ich bei invoke eine Exception:
Code:
java.lang.IllegalArgumentException: object is not an instance of declaring class
	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.pcd.wam.gegenstandsbereich.streetDetection.locating.controller.OfflineProcessor.loadExternalLibary(OfflineProcessor.java:117)
	at org.pcd.wam.test.TestOfflineProcessor.main(TestOfflineProcessor.java:16)

Die nachgeladene Klasse sieht so aus:
Code:
package org.pcd.wam.technologie.nmea.parser;

import java.util.LinkedList;
import java.util.List;

import org.pcd.wam.gegenstandsbereich.streetDetection.locating.model.Track;
import org.pcd.wam.gegenstandsbereich.streetDetection.locating.parser.ITrackParser;

public class DummyParser implements ITrackParser {

	public String getReceiverId() {
		// TODO Auto-generated method stub
		return "dummy wert!";
	}

	public List<Track> getTracks(String s) {
		List<Track> tList = new LinkedList<Track>();
		Track t = new Track();
		t.setCmt("dummy wert");
		return tList;
	}

}


aufgerufen wird das ganze mit:
Code:
public static void main(String[] args) {
		String path = "C:\\work\\";
		String jarName = "test.jar";
		String className = "org.parser.DummyParser";

		FileSystemProcessor f = new FileSystemProcessor(path, jarName, className);
		f.loadExternalLibary();
	}
Kann mir jemand verraten was ich falsch mache bzw wie ich die Methoden getReceiverId und getTracks ansprechen kann per Reflection
 
Zuletzt bearbeitet:
Sauber, danke!

Jedoch verschließt sich mir hier der Sinn - heißt das im Klartext dass ich noch keine Instanz der Klasse hatte?

mfg
 
Zurück