2010-12-09 3 views
8

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

ответ

11

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

EDIT: Как перевести эти примеры. 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); 

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

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

+0

Field.get() возвращает объект любого типа данных. Он не проверяется статически. – 2010-12-09 13:01:17

0

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

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

0

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

Смежные вопросы