Ich habe eine Klasse, die XML und Reflection verwendet, um Object
s an eine andere Klasse zurückzugeben.
Normalerweise sind diese Objekte Unterfelder eines externen Objekts, aber gelegentlich möchte ich sie im laufenden Betrieb generieren. Ich habe so etwas versucht, aber ohne Erfolg. Ich glaube, das liegt daran, dass Sie mit Java nicht auf private
Methoden zur Reflexion zugreifen können.
Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");
if ("SomeObject".equals(objectName))
object = someObject;
else
object = this;
method = object.getClass().getMethod(methodName, (Class[]) null);
Wenn die angegebene Methode ist private
, schlägt sie mit a fehl NoSuchMethodException
. Ich könnte es lösen, indem ich die Methode public
mache oder eine andere Klasse mache, von der ich sie ableiten kann.
Kurz gesagt, ich habe mich nur gefragt, ob es eine Möglichkeit gibt, private
über Reflexion auf eine Methode zuzugreifen .
quelle
getDeclaredMethod()
statt nur aufrufengetMethod()
- dies funktioniert nicht für private Methoden.private
Zugriff eine ähnliche Rolle spielt.Verwenden Sie
getDeclaredMethod()
diese Option , um ein privates Methodenobjekt abzurufen und anschließendmethod.setAccessible()
zuzulassen, dass es tatsächlich aufgerufen wird.quelle
java.lang.StackOverflowError
wenn ich nicht anrufesetAccessible(true)
.Wenn die Methode einen nicht primitiven Datentyp akzeptiert, kann die folgende Methode verwendet werden, um eine private Methode einer beliebigen Klasse aufzurufen:
Die akzeptierten Parameter sind obj, methodName und die Parameter. Beispielsweise
Die Methode concatString kann als aufgerufen werden
quelle
Sie können dies mit ReflectionTestUtils of Spring ( org.springframework.test.util.ReflectionTestUtils ) tun.
Beispiel: Wenn Sie eine Klasse mit einer privaten Methode haben
square(int x)
quelle
Lassen Sie mich vollständigen Code für ausführungsgeschützte Methoden per Reflektion bereitstellen. Es unterstützt alle Arten von Parametern, einschließlich Generika, Autobox-Parametern und Nullwerten
Die Methode verwendet Apache ClassUtils, um die Kompatibilität von Autobox-Parametern zu überprüfen
quelle
Eine weitere Variante ist die Verwendung einer sehr leistungsstarken JOOR-Bibliothek https://github.com/jOOQ/jOOR
Es ermöglicht das Ändern von Feldern wie endgültigen statischen Konstanten und das Aufrufen Ihrer geschützten Methoden, ohne dass in der Vererbungshierarchie eine konkrete Klasse angegeben wird
quelle
Sie können Manifolds @Jailbreak für die direkte, typsichere Java-Reflexion verwenden:
@Jailbreak
Schaltet diefoo
lokale Variable im Compiler für den direkten Zugriff auf alle Mitglieder inFoo
der Hierarchie frei.Ebenso können Sie die Erweiterungsmethode jailbreak () für die einmalige Verwendung verwenden:
Über die
jailbreak()
Methode können Sie auf jedes Mitglied inFoo
der Hierarchie zugreifen .In beiden Fällen löst der Compiler den Methodenaufruf für Sie typsicher wie eine öffentliche Methode auf, während Manifold unter der Haube einen effizienten Reflektionscode für Sie generiert.
Wenn der Typ statisch nicht bekannt ist, können Sie alternativ mithilfe der strukturellen Typisierung eine Schnittstelle definieren, die ein Typ erfüllen kann, ohne seine Implementierung deklarieren zu müssen. Diese Strategie gewährleistet die Typensicherheit und vermeidet Leistungs- und Identitätsprobleme im Zusammenhang mit Reflection und Proxy-Code.
Erfahren Sie mehr über Manifold .
quelle