Java Reflection

Generic1

Top Contributor
Hallo,

ich habe eine TestKlasse und eine Main- Klasse. Von der Main- Klasse aus möchte ich eine Methode der TestKlasse aus aufrufen -> ich weiß den Namen der Methode aber nicht den genauen Type des Parameters.
Mit TestKlasse.class.getMethod("setString", String.class); funktionierts, da String.class der genaue Typ ist, wenn ichs aber jetzt mit TestKlasse.class.getMethod("setString", Object.class); versuche, dann klappts nicht.
Kennt jemand eine Möglichkeit, wie man das machen könnte, dass ich eine Referenz auf eine Mehtode über Reflection bekomme, von der ich nicht den/die genauen Parametertypen kenne.

"getMethods()" möcht ich übrigens nicht verwenden, da ich das sehr oft mache und es sich um sehr viele Methoden handelt.
lg


Java:
package javaapplication21;

public class TestKlasse {

    public void setString(String s) {}

    public void setString(String s1, String s2) {}

    private String getString(String s) {
        return s;
        }
    }

Java:
package javaapplication21;

import java.lang.reflect.Method;

public class Main {

    public Main() throws NoSuchMethodException {

        Method m = TestKlasse.class.getMethod("setString", String.class);
        System.out.println("Das ist die Methode: " + m);
        }

    public static void main(String[] args) throws NoSuchMethodException {
        final Main main = new Main();
        }
    }
 
Nach deiner Beschreibung kann ich nicht genau sagen, was du wirklich brauchst. Falls du da an einem richtigen Projekt sitzt, wird es sicher eine bessere Lösung für dein Problem geben, als Reflection.
Wenn du nur ein wenig probieren möchtest, um dich fortzubilden, dürfte dir der Performance-Aspekt doch egal sein...

Was ist denn genau das Ziel?
 
Von der Main- Klasse aus möchte ich eine Methode der TestKlasse aus aufrufen -> ich weiß den Namen der Methode aber nicht den genauen Type des Parameters.
Dann weisst du folglich auch nicht was ein richtiges bzw. falsches Ergebniss sein würde und kannst daher aus nichts testen, kannst dir das alles also sparen 🙂
 
Ich weiß, wie die Methode heißt und ich weiß, was der erste Parameter für einen Typ hat, ich kenne aber den Typ des zweiten Parameters nicht -> aber wenn ich eine Methode bekomme, wo der Name passt und der erste Parameter - dann passt das für mich - das kann ich der JVM aber nicht klar machen, oder gibts da eine Möglichkeit?
lg
 
Also hier ist ein Beispiel in dem die Konstruktoren und deren Parameterklassen herausgefunden werden.

und hier eines bei dem bestimmte Methoden ausgegeben werden .....

Aber ohne getDeclaredMethods() wird es wohl kaum gehen.

Ich frage mich nur, wie du eine Methode aufrufen willst, von der du das genaue Parameterprofil nicht von vornherein kennst ...
 
Ich frage mich nur, wie du eine Methode aufrufen willst, von der du das genaue Parameterprofil nicht von vornherein kennst ...
Java:
public class Tester {
    public static void main(String[] args) throws Exception {
        Class<?> class1 = Test.class;
        Method method = class1.getMethod("foo", String.class, Integer.class);
        Object o = "hello world";
        Object i = 10;
        method.invoke(class1.newInstance(), o, i);
    }
}

public class Test {
    public void foo(String s, Integer k) {
        System.out.println(s);
        System.out.println(k);
    }
}

beim aufruf kannst du dann einfach Object reinreichen egal was der typ des parameters ist... also sobald man die methode hat ists somit egal...

@Topic:
Nein so wie du das willst geht es nicht... du musst dir schon einaml alle methoden holen und über den Namen gehen...
ich schließe mich aber den anderen an... das klingt mehr als komisch und eher fragwürdig als dem zu folgen
 
Zuletzt bearbeitet von einem Moderator:
Java:
    method.invoke(class1.newInstance(), o, i);

    public void foo(String s, Integer k) {...}

beim Aufruf kannst du dann einfach Object reinreichen egal was der typ des parameters ist... also sobald man die methode hat ists somit egal...

Die beiden müssen passen - wenn da plötzlich eine Klasse Test ist:
Java:
public class Test {
	public void foo(Integer k, String s) {
		System.out.println(s);
		System.out.println(k);
	}
}

Du gehst in deinem Beispiel von einem bekannten Parameterprofil aus (String, int), auch wenns auf Object gecastet ist.

Total ohne Ahnung betreffend Anzahl, Typ und Reihenfolge der Parameter geht das wohl kaum.
(Oder kann man den ganzen Aufruf erst als String zusammenbauen und dann ausführen?)
 
Versteh auch nicht so ganz wo das Problem ist denn:

Um die Methode aufzurufen werden die Parameter benötigt.
Die Parameter wiederum müssen vom Typ her auf die Methode passen

Code:
void setA(String x){..}

Object o = new Object();

getMethod("setA", String.class).invoke(target, o);

wird nicht funktionieren, der konkrete Typ des Parameters muss passen. Von dem her musst du die genauen Parametertypen schon irgendwo/irgendwie vorliegen haben, sonst wird das nix.
 

Neue Themen


Zurück
Oben