У меня есть класс, который использует XML и отражение, чтобы вернуть Object
s в другой класс.
Обычно эти объекты являются подполями внешнего объекта, но иногда это то, что я хочу генерировать на лету. Я пробовал что-то подобное, но безрезультатно. Я считаю, что это потому, что Java не позволит вам получить доступ к private
методам для размышлений.
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);
Если предоставленный метод private
, он завершается неудачно с NoSuchMethodException
. Я мог бы решить это, создав метод public
или создав другой класс для его получения.
Короче говоря, мне просто интересно, есть ли способ получить доступ к private
методу с помощью рефлексии.
источник
getDeclaredMethod()
вместо простоgetMethod()
- это не будет работать для частных методов.private
доступе, играющем подобную роль.Используйте,
getDeclaredMethod()
чтобы получить закрытый объект Method, а затем используйте,method.setAccessible()
чтобы позволить фактически вызвать его.источник
java.lang.StackOverflowError
если я не звонюsetAccessible(true)
.Если метод принимает непримитивный тип данных, то для вызова закрытого метода любого класса можно использовать следующий метод:
Принимаются следующие параметры: obj, methodName и параметры. Например
Метод concatString может быть вызван как
источник
Вы можете сделать это, используя ReflectionTestUtils of Spring ( org.springframework.test.util.ReflectionTestUtils )
Пример: если у вас есть класс с закрытым методом
square(int x)
источник
Позвольте мне предоставить полный код для выполнения защищенных методов с помощью отражения. Он поддерживает любые типы параметров, включая обобщенные, автоматически упакованные параметры и нулевые значения.
Метод использует apache ClassUtils для проверки совместимости автоматически помещаемых параметров
источник
Еще один вариант - использование очень мощной библиотеки JOOR https://github.com/jOOQ/jOOR.
Это позволяет изменять любые поля, такие как конечные статические константы и вызывать защищенные методы без указания конкретного класса в иерархии наследования.
источник
Вы можете использовать @Jailbreak от Manifold для прямого, типобезопасного отражения Java:
@Jailbreak
разблокируетfoo
локальную переменную в компиляторе для прямого доступа ко всем членам вFoo
иерархии.Точно так же вы можете использовать метод расширения jailbreak () для одноразового использования:
С помощью
jailbreak()
метода вы можете получить доступ к любому члену вFoo
российской иерархии.В обоих случаях компилятор разрешает вызов метода для вас безопасно, как если бы это был публичный метод, в то время как Manifold генерирует эффективный код отражения для вас.
В качестве альтернативы, если тип статически неизвестен, вы можете использовать Структурную типизацию, чтобы определить интерфейс, который может удовлетворить тип, не объявляя его реализацию. Эта стратегия поддерживает безопасность типов и позволяет избежать проблем производительности и идентификации, связанных с рефлексией и прокси-кодом.
Узнайте больше о коллектор .
источник