Wenn ich zwei Variablen habe:
Object obj;
String methodName = "getName";
obj
Wie kann ich die durch identifizierte Klasse aufrufen, ohne die Klasse von zu kennen ?methodName
zu kennen?
Die aufgerufene Methode hat keine Parameter und einen String
Rückgabewert. Es ist ein Getter für eine Java-Bohne .
java
reflection
invoke
Brasskazoo
quelle
quelle
Antworten:
Codierung von der Hüfte aus wäre so etwas wie:
Die Parameter geben die sehr spezifische Methode an, die Sie benötigen (wenn mehrere überladene Methoden verfügbar sind und die Methode keine Argumente enthält, geben Sie nur an
methodName
).Dann rufen Sie diese Methode durch Aufrufen auf
Lassen Sie die Argumente wieder weg
.invoke
, wenn Sie keine haben. Aber ja. Lesen Sie mehr über Java Reflectionquelle
method
inmethod.invoke(obj, arg1, arg2,...);
. amethod = null;
löst das Problem, aber es ist keine schlechte Idee, es in der Antwort zu erwähnen.invoke
wird alles zurückgegeben, was sie zurückgegeben hat. Wenn beim Ausführen der Methode eine Ausnahme auftritt, wird die Ausnahme in eine eingeschlossenInvocationTargetException
.Verwenden Sie den Methodenaufruf aus der Reflexion:
Wo:
"class name"
ist der Name der KlasseobjectToInvokeOn
ist vom Typ Objekt und ist das Objekt, für das Sie die Methode aufrufen möchten"method name"
ist der Name der Methode, die Sie aufrufen möchtenparameterTypes
ist vom TypClass[]
und deklariert die Parameter, die die Methode verwendetparams
ist vom TypObject[]
und deklariert die Parameter, die an die Methode übergeben werden sollenquelle
Für diejenigen, die ein einfaches Codebeispiel in Java 7 wünschen:
Dog
Klasse:ReflectionDemo
Klasse:Ausgabe:
Mishka is 3 year(s) old.
Sie können den Konstruktor mit folgenden Parametern aufrufen:
Alternativ können Sie entfernen
und TU
Empfohlene Lektüre: Erstellen neuer Klasseninstanzen
quelle
Method
Objekt?Die Methode kann so aufgerufen werden. Es gibt auch mehr Möglichkeiten (überprüfen Sie die Reflection-API), aber dies ist die einfachste:
quelle
Erstens nicht. Vermeiden Sie diese Art von Code. Es ist in der Regel sehr schlechter Code und auch unsicher (siehe Abschnitt 6 der Richtlinien für sichere Codierung für die Java-Programmiersprache, Version 2.0 ).
Wenn Sie es tun müssen, ziehen Sie java.beans der Reflexion vor. Bohnen umhüllen die Reflexion und ermöglichen einen relativ sicheren und konventionellen Zugang.quelle
Um die Antworten meines Kollegen zu vervollständigen, sollten Sie Folgendes beachten:
Hier ist ein alter Java1.4-Code, der diese Punkte berücksichtigt:
quelle
quelle
quelle
Wenn Sie den Aufruf mehrmals ausführen, können Sie die in Java 7 eingeführten neuen Methodenhandles verwenden. Hier geht es um Ihre Methode, die einen String zurückgibt:
quelle
invokeExact
möchten Sie diese verwenden, wann immer Sie können. Dafür muss die Signatur der Aufrufsite jedoch genau mit dem Typ des Methodenhandles übereinstimmen. Normalerweise muss man ein wenig basteln, um zur Arbeit zu kommen. In diesem Fall müssten Sie den ersten Parameter mit:methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
String result = (String) methodHandle.invokeExact(obj);
Dies klingt nach etwas, das mit dem Java Reflection-Paket machbar ist.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Insbesondere unter Aufrufen von Methoden nach Namen:
import java.lang.reflect. *;
quelle
Indizierung (schneller)
Sie können
FunctionalInterface
Methoden in einem Container speichern, um sie zu indizieren. Sie können den Array-Container verwenden, um sie über Zahlen aufzurufen, oder die Hashmap, um sie über Zeichenfolgen aufzurufen. Mit diesem Trick können Sie Ihre Methoden indizieren, um sie dynamisch schneller aufzurufen .Lambda-Syntax
Sie können auch die Lambda-Syntax verwenden:
quelle
O(1)
.SomeClass
ist die Klasse undsomeVariable
ist eine Variable.quelle
Ich mache das so:
quelle
Der folgende Code kann Ihnen helfen.
Vielen Dank....
quelle
Hier sind die BEREITSCHUTZMETHODEN:
So rufen Sie eine Methode ohne Argumente auf:
So rufen Sie eine Methode mit Argumenten auf:
Verwenden Sie die oben genannten Methoden wie folgt:
Ausgabe:
quelle
Student.java
StudentTest.java
quelle
Sie sollten Reflection verwenden - ein Klassenobjekt und dann eine Methode in dieser Klasse initiieren und diese Methode dann für ein Objekt mit optionalen Parametern aufrufen . Denken Sie daran, das folgende Snippet in den Try-Catch- Block zu packen
Ich hoffe es hilft!
quelle
Das funktioniert gut für mich:
}}
Ausgabe:
My input testparam
Ich kann die Methode aufrufen, indem ich ihren Namen an eine andere Methode (wie main) übergebe.
quelle
mit
import java.lang.reflect.*;
und so benutzt du es:
quelle
Mit jooR ist es nur:
Hier ist ein ausführlicheres Beispiel:
Dies druckt:
quelle
Für mich wäre ein ziemlich einfacher und narrensicherer Weg, einfach eine Methodenaufrufmethode wie folgt zu erstellen:
Wenn Sie dann die Methode aufrufen müssen, geben Sie einfach so etwas ein
quelle
className.getName().toString()
? Sie vermissen den ganzen Reflexionspunkt.