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.
Hier bekomme ich bei invoke eine Exception:
Die nachgeladene Klasse sieht so aus:
aufgerufen wird das ganze mit:
Kann mir jemand verraten was ich falsch mache bzw wie ich die Methoden getReceiverId und getTracks ansprechen kann per Reflection
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);
}
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();
}