Mam klasę, która używa XML i odbicia, aby zwrócić Object
s do innej klasy.
Zwykle te obiekty są polami podrzędnymi obiektu zewnętrznego, ale czasami jest to coś, co chcę wygenerować w locie. Próbowałem czegoś takiego, ale bezskutecznie. Uważam, że dzieje się tak, ponieważ Java nie pozwala na dostęp do private
metod refleksji.
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);
Jeśli podana metoda to private
, zakończy się niepowodzeniem z plikiem NoSuchMethodException
. Mógłbym to rozwiązać, tworząc metodę public
lub inną klasę, z której będzie pochodziła.
Krótko mówiąc, zastanawiałem się, czy istnieje sposób na dostęp do private
metody poprzez refleksję.
źródło
getDeclaredMethod()
zamiast tylkogetMethod()
- to nie zadziała w przypadku metod prywatnych.private
dostępie odgrywającym podobną rolę.Użyj,
getDeclaredMethod()
aby uzyskać prywatny obiekt Method, a następnie użyj,method.setAccessible()
aby zezwolić na jego wywołanie.źródło
java.lang.StackOverflowError
jeśli nie dzwonięsetAccessible(true)
.Jeśli metoda akceptuje inny niż pierwotny typ danych, do wywołania metody prywatnej dowolnej klasy można użyć następującej metody:
Akceptowanymi parametrami są obj, nazwa metody i parametry. Na przykład
Metoda concatString może zostać wywołana jako
źródło
możesz to zrobić za pomocą ReflectionTestUtils of Spring ( org.springframework.test.util.ReflectionTestUtils )
Przykład: jeśli masz klasę z metodą prywatną
square(int x)
źródło
Pozwól, że dostarczę kompletny kod dla metod chronionych przed wykonaniem za pomocą odbicia. Obsługuje dowolne typy parametrów, w tym typy ogólne, parametry z automatyczną skrzynką i wartości null
Metoda używa klasy Apache ClassUtils do sprawdzania zgodności parametrów z automatycznym blokowaniem
źródło
Jeszcze jeden wariant wykorzystuje bardzo potężną bibliotekę JOOR https://github.com/jOOQ/jOOR
Pozwala modyfikować dowolne pola, takie jak końcowe stałe statyczne i wywoływać metody chronione bez określania konkretnej klasy w hierarchii dziedziczenia
źródło
Możesz użyć @Jailbreak Manifolda do bezpośredniego, bezpiecznego dla typu odzwierciedlenia Java:
@Jailbreak
odblokowujefoo
zmienną lokalną w kompilatorze w celu bezpośredniego dostępu do wszystkich członków wFoo
hierarchii.Podobnie możesz użyć metody rozszerzenia jailbreak () do jednorazowego użycia:
Za pomocą tej
jailbreak()
metody można uzyskać dostęp do dowolnego członka wFoo
hierarchii.W obu przypadkach kompilator rozwiązuje wywołanie metody dla Ciebie, bezpiecznie wpisując, jak w przypadku metody publicznej, podczas gdy Manifold generuje wydajny kod odbicia pod maską.
Alternatywnie, jeśli typ nie jest znany statycznie, możesz użyć typowania strukturalnego, aby zdefiniować interfejs, który może spełniać typ, bez konieczności deklarowania jego implementacji. Ta strategia zapewnia bezpieczeństwo typów i pozwala uniknąć problemów z wydajnością i tożsamością związanych z odbiciem i kodem proxy.
Dowiedz się więcej o kolektorze .
źródło