2010-12-09 15 views
8

Estoy convirtiendo algún código python a java, y tengo una situación en la que necesito llamar a métodos de un objeto pero no sé qué métodos hasta el tiempo de ejecución. En Python lo resuelvo usando getattr en mi objeto y pasándole una cadena que es el nombre de mi método. ¿Cómo harías algo similar en Java?¿Equivalente Java al getattr de python?

Respuesta

11

Class.getField es tu amigo. Sin embargo, probablemente no sea muy sencillo ya que Python está tipeado dinámicamente y Java está tipado estáticamente (a menos que conozca los tipos de sus campos por adelantado).

EDITAR: Cómo traducir estos ejemplos. http://effbot.org/zone/python-getattr.htm

atributo de búsqueda

Python

//normal 
value = obj.attribute 

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

Java

//normal 
value = obj.attribute; 

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


método de llamada de

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); 

En los casos más simples, lo que necesita saber si usted tiene un campo o un método. esp, ya que pueden tener el mismo nombre. Además, los métodos pueden estar sobrecargados, por lo que debe saber qué método de firma desea.

Si no te importa qué método o campo obtienes, puedes implementar esto como un método de ayuda con bastante facilidad.

+0

Field.get() devuelve un objeto de cualquier tipo de datos. No está comprobado estáticamente. –

+1

@ Peter: Lo mismo con 'getattr'; Los desarrolladores de Python no tienen miedo de lo desconocido :-) –

+0

@ Peter No estoy seguro de cuál es su punto. En Python puedes hacer 'getattr (obj," field ") * 2' y eso funciona con ints, floats, strings, listas, etc. Intentando hacer eso en Java. – NPE

0

Puede comenzar here para obtener más información acerca de Java Reflection.

0

En Java, usted hace esto con la Reflection API (y suele ser bastante engorrosa).

MethodUtils en Apache Commons El proyecto BeanUtils puede hacer que sea un poco más fácil trabajar con él, aunque es una dependencia bastante fuerte para algo tan simple como esto.