Reflection - wie kann ich eine Methode benutzen

Status
Nicht offen für weitere Antworten.

y0dA

Top Contributor
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
 
S

SlaterB

Gast
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Class c = DummyParser.class;
        if (!ITrackParser.class.isAssignableFrom(c))
        {
            System.out.println("aus die Maus");
            return;
        }

        ITrackParser it = (ITrackParser)c.newInstance();
        System.out.println(it.getReceiverId());
        System.out.println(it.getTracks("Auto"));
    }
}


interface ITrackParser
{

    public String getReceiverId();

    public List<String> getTracks(String s);
}


class DummyParser
    implements ITrackParser
{

    public String getReceiverId()
    {
        return "dummy wert!";
    }

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

y0dA

Top Contributor
SlaterB hat gesagt.:
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        Class c = DummyParser.class;
        if (!ITrackParser.class.isAssignableFrom(c))
        {
            System.out.println("aus die Maus");
            return;
        }

        ITrackParser it = (ITrackParser)c.newInstance();
        System.out.println(it.getReceiverId());
        System.out.println(it.getTracks("Auto"));
    }
}


interface ITrackParser
{

    public String getReceiverId();

    public List<String> getTracks(String s);
}


class DummyParser
    implements ITrackParser
{

    public String getReceiverId()
    {
        return "dummy wert!";
    }

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

Ich kenne zur Laufzeit nicht den Namen der Klasse (also DummyParser).

Die Lösung zu meinem Problem war dass ich bei invoke keine Instanz der Klasse hatte, welche die Methode ausführt:
Code:
m.invoke(this.c.newInstance());

Trotzdem gefällt mir dein Code besser (muss ihn nur adaptieren) - habe mich heute erstmal an dieses Thema gewagt.

Dankeschön.
 
S

SlaterB

Gast
dass du die Klasse mit dem ClassLoader usw. laden musst ist klar,
aber ab dem Zeitpunkt, ab dem du das Class-Objekt hast,
kannst du meinen einfacheren Weg verwenden,

der Test auf das Interface ist viel einfacher,
und die Operation musst du nicht per Reflection aufrufen,
caste das Objekt auf das Interface und arbeite ganz normal weiter
 

y0dA

Top Contributor
jo jo, hast Recht!

Hab meinen Post eh schon editiert.

Danke dir.


**EDIT**
Eine Frage hätte ich dann doch noch:

Code:
if (!ITrackParser.class.isAssignableFrom(c)) {					
				/* class does not implement needed interface */
				try {
					throw new Exception("external class " + this.className + " does not implement needed "
							+ ITrackParser.class);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

Welche Art von Exception sollte ich hier werfen, sprich gibt es eine spezifierte Exception dafür, dass eine Klasse nicht "korrekt" ist bzw nicht das richtige Interface implementiert? Oder muss ich mit ne eigene Exception Klasse schreiben?

mfg

**EDIT**
Gut werfe nun eine UnsupportedOperationException.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
X Reflection performant? Allgemeine Java-Themen 11
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben