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
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.
Puede comenzar here para obtener más información acerca de Java Reflection.
Puede usar java reflection, pero no hay un equivalente exacto de getattr
.
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.
Debe usar Reflection API. Como la API pura es un poco ... inaccesible, deberías echar un vistazo a los ayudantes como commons beanutils o reflections.
- 1. equivalente PHP de enviar y getattr?
- 2. ¿Cuál es el equivalente en rubí del getattr de python?
- 3. Python equivalente al BitSet de Java
- 4. Python getattr equivalent for dictionaries?
- 5. Python "Evento" equivalente en Java?
- 6. Java Mahout equivalente en Python
- 7. Python Cadena getattr como una cadena
- 8. equivalente Java del formato de Python()
- 9. Python equivalente de getClass de Java() getFields()
- 10. equivalente de Java de Python repr()?
- 11. equivalente en Java de struct.pack de Python?
- 12. Ruby equivalente de Python setattr()
- 13. Ruby equivalente al "dir" de Python?
- 14. equivalente de Java a bisección en python
- 15. ¿El equivalente TreeSet de Java en Python?
- 16. Java equivalente para str.strip de Python()
- 17. Java Equivalente a los diccionarios de Python
- 18. .Net equivalente al AssertionError de Java
- 19. C# equivalente al charAt de Java()?
- 20. Equivalente al DateTime.Now de C# en Java?
- 21. C# equivalente al recurso de Java
- 22. ¿Es una mala práctica usar getattr de python extensivamente?
- 23. ¿Existe un Python equivalente al comando 'which'
- 24. Equivalente al comando "whos" en Python Numpy
- 25. enumeración de Python equivalente
- 26. ¿Por qué Python no tiene un getattr híbrido + __getitem__ incorporado?
- 27. ¿Cómo iniciar la función getattr en python con parámetros adicionales?
- 28. asignar un atributo mediante getattr
- 29. ¿Cuál es el equivalente de Groovy al dir de Python()?
- 30. ¿Cuál es el equivalente de Python al "inspeccionar" de Ruby?
Field.get() devuelve un objeto de cualquier tipo de datos. No está comprobado estáticamente. –
@ Peter: Lo mismo con 'getattr'; Los desarrolladores de Python no tienen miedo de lo desconocido :-) –
@ 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