Java эквивалент getattr Python? - PullRequest
       1

Java эквивалент getattr Python?

8 голосов
/ 09 декабря 2010

Я конвертирую некоторый код Python в Java, и у меня возникла ситуация, когда мне нужно вызывать методы объекта, но я не знаю, какие методы до времени выполнения.В Python я решаю эту проблему, используя getattr для моего объекта и передавая ему строку, которая является именем моего метода.Как бы вы сделали что-то подобное в Java?

Ответы [ 6 ]

12 голосов
/ 09 декабря 2010

Class.getField ваш друг. Возможно, это будет не очень просто, поскольку Python динамически типизирован, а Java статически типизирован (если вы заранее не знаете типы полей).

РЕДАКТИРОВАТЬ: Как перевести эти примеры. http://effbot.org/zone/python-getattr.htm

Поиск атрибутов

Python

//normal
value = obj.attribute

//runtime
value = getattr(obj, "attribute")

Java

//normal
value = obj.attribute;

//runtime
value = obj.getClass().getField("attribute").get(obj);


вызов метода

Python

//normal
result = obj.method(args)

//runtime 
func = getattr(obj, "method")
result = func(args)

Java

//normal
result = obj.method(args);

//runtime
Method func = obj.getClass().getMethod("method", Object[].class);
result = func.invoke(obj, args);

В более простых случаях вам нужно знать, есть ли у вас поле или метод. особенно если они могут иметь одно и то же имя. Кроме того, методы могут быть перегружены, поэтому вам нужно знать, какую подпись метода вы хотите.

Если вам все равно, какой метод или поле вы получите, вы можете довольно легко реализовать его как вспомогательный метод.

0 голосов
/ 07 февраля 2019

Самый простой способ справиться с этим - создать объект Map в классе Java и продолжать добавлять пары «имя-значение» и извлекать его соответствующим образом, хотя он может не поддерживать различные типы, которые поддерживает setAttr.

0 голосов
/ 09 декабря 2010

Вы должны использовать Reflection API .Поскольку чистый API немного ... недоступен, вы должны взглянуть на таких помощников, как commons beanutils или отражений .

0 голосов
/ 09 декабря 2010

В Java вы делаете это с помощью Reflection API (и это обычно довольно громоздко).

MethodUtils в проекте Apache Commons BeanUtils может немного облегчить работу, хотя это довольно внушительная зависимость для чего-то простого.

0 голосов
/ 09 декабря 2010

Вы можете использовать Java Reflection , но нет точного эквивалента getattr.

0 голосов
/ 09 декабря 2010

Вы можете начать здесь , чтобы узнать о Java Reflection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...