Si tengo dos variables:
Object obj;
String methodName = "getName";
Sin conocer la clase de obj
, ¿cómo puedo llamar al método identificado por methodName
él?
El método que se llama no tiene parámetros y tiene un String
valor de retorno. Es un captador para un bean Java .
java
reflection
invoke
brasskazoo
fuente
fuente
Respuestas:
Codificación desde la cadera, sería algo así como:
Los parámetros identifican el método muy específico que necesita (si hay varios sobrecargados disponibles, si el método no tiene argumentos, solo dé
methodName
).Luego invocas ese método llamando
Nuevamente, omita los argumentos
.invoke
, si no tiene ninguno. Pero sí. Leer sobre Java Reflectionfuente
method
inmethod.invoke(obj, arg1, arg2,...);
. Amethod = null;
resuelve el problema, pero mencionarlo en la respuesta no es una mala idea.invoke
devolverá lo que haya devuelto. Si se produce una excepción al ejecutar el método, la excepción se envolverá en unInvocationTargetException
.Utilice la invocación del método desde la reflexión:
Dónde:
"class name"
es el nombre de la claseobjectToInvokeOn
es de tipo Object y es el objeto sobre el que desea invocar el método"method name"
es el nombre del método al que quieres llamarparameterTypes
es de tipoClass[]
y declara los parámetros que toma el métodoparams
es de tipoObject[]
y declara los parámetros que se pasarán al métodofuente
Para aquellos que desean un ejemplo de código directo en Java 7:
Dog
clase:ReflectionDemo
clase:Salida:
Mishka is 3 year(s) old.
Puede invocar al constructor con parámetros de esta manera:
Alternativamente, puedes eliminar
y hacer
Lectura sugerida: creación de nuevas instancias de clase
fuente
Method
objeto?El método se puede invocar así. También hay más posibilidades (verifique la API de reflexión), pero esta es la más simple:
fuente
Primero, no lo hagas. Evita este tipo de código. Tiende a ser un código realmente malo e inseguro también (consulte la sección 6 de las Pautas de codificación segura para el lenguaje de programación Java, versión 2.0 ).
Si debe hacerlo, prefiera java.beans a la reflexión. Los frijoles envuelven la reflexión permitiendo un acceso relativamente seguro y convencional.fuente
Para completar las respuestas de mi colega, es posible que desee prestar mucha atención a:
Aquí hay un viejo código java1.4 que tiene en cuenta esos puntos:
fuente
fuente
fuente
Si realiza la llamada varias veces, puede usar los nuevos identificadores de método introducidos en Java 7. Aquí vamos a su método que devuelve una Cadena:
fuente
invokeExact
siempre que puedas. Para eso, la firma del sitio de llamada tiene que coincidir exactamente con el tipo de identificador de método. Por lo general, toma un poco de tiempo para llegar al trabajo. En este caso, tendría que emitir el primer parámetro con:methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));
y luego invocar comoString result = (String) methodHandle.invokeExact(obj);
Esto suena como algo factible con el paquete Java Reflection.
http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html
Particularmente en Métodos de invocación por nombre:
import java.lang.reflect. *;
fuente
Indexación (más rápido)
Puede usar
FunctionalInterface
para guardar métodos en un contenedor para indexarlos. Puede usar el contenedor de matriz para invocarlos por números o hashmap para invocarlos por cadenas. Con este truco, puede indexar sus métodos para invocarlos dinámicamente más rápido .Sintaxis Lambda
También puede usar la sintaxis lambda:
fuente
O(1)
.SomeClass
es la clase ysomeVariable
es una variablefuente
Hago esto así:
fuente
Consulte el siguiente código que puede ayudarlo.
Gracias....
fuente
Aquí están los MÉTODOS LISTOS PARA USAR:
Para invocar un método, sin argumentos:
Para invocar un método, con Argumentos:
Utilice los métodos anteriores de la siguiente manera:
Salida:
fuente
Estudiante.java
StudentTest.java
fuente
Debe usar la reflexión: inicie un objeto de clase, luego un método en esta clase y luego invoque este método en un objeto con parámetros opcionales . Recuerde envolver el siguiente fragmento en el bloque try-catch
¡Espero eso ayude!
fuente
Esto está funcionando bien para mí:
}
Salida:
My input testparam
Puedo invocar el método pasando su nombre a otro método (como main).
fuente
utilizando
import java.lang.reflect.*;
y así es como lo usas:
fuente
Con jooR es simplemente:
Aquí hay un ejemplo más elaborado:
Esto imprime:
fuente
para mí, una manera bastante simple y a prueba de tontos sería simplemente hacer un método de método de llamada así:
entonces cuando necesites llamar al método simplemente pon algo como esto
fuente
className.getName().toString()
? Te estás perdiendo todo el punto de reflexión.