Como parte del desarrollo de una pequeña ScriptEngine, que reflexivamente llamar a métodos Java. Una llamada del motor de script me proporciona el objeto, el nombre del método y una matriz de argumentos. Para llamar al método, traté de resolverlo con una llamada a Class.getMethod (nombre, tipos de argumentos).
Sin embargo, esto solo funciona cuando las clases de los argumentos y las clases esperadas por el Método son las mismas.Calling más cercano método de ajuste
Object o1 = new Object();
Object out = System.out;
//Works as System.out.println(Object) is defined
Method ms = out.getClass().getMethod("println",o1.getClass());
Object o2 = new Integer(4);
//Does not work as System.out.println(Integer) is not defined
Method mo = out.getClass().getMethod("println",o2.getClass());
me gustaría saber si hay una manera "simple" para obtener el método correcto, si es posible con el ajuste más cercano de los tipos de argumentos, o si tengo que aplicar esto a mí mismo.
ajuste más cercano sería:
Object o1 = new Integer(1);
Object o2 = new String("");
getMethod(name, o1.getClass())//println(Object)
getMethod(name, o2.getClass())//println(String)
Actualización:
Para aclarar lo que necesito: el motor de guiones es un pequeño proyecto que escribo en mi tiempo libre así que no hay reglas STRIKT que tengo seguir. Así que pensé que la selección de los métodos llamó desde el motor de la misma manera que el compilador Java selecciona métodos en tiempo de compilación solamente con el tipo dinámico y no el tipo estático del objeto funcionaría. (Con o sin autoboxing)
Esto es lo que primero esperaba que Class.getMethod() resolviera. Pero el Class.getMethod() requiere las mismas clases exactas que los tipos de argumento como declara el método, el uso de una subclase dará como resultado un método que no Exception. Esto puede suceder por buenas razones, pero hace que el método sea inútil para mí, ya que no sé de antemano qué tipos de argumento cabrían.
Una alternativa sería llamar Class.getMethods() y iterar a través de la matriz devuelta y tratar de encontrar un método apropiado. Sin embargo, esto sería complicado si yo no sólo quiero dar el primer método de "bueno" el que me encuentro, por lo que espera que no habría una solución existente cuales al menos manijas:
- ajuste más cercano: si arg.getClass() == de subclases y métodos m (superclase), m (subclase) entonces llaman m (subclase)
- argumentos variables: System.out.printf (String, String ...)
El soporte para el autoboxing también sería bueno.
Si una llamada no se puede resolver, puede emitir una excepción (ma (String, Object), ma (Object, String), args = String, String)
(Si ha llegado hasta aquí, gracias por tomarse el tiempo para leyó :-))
primero definir reglas estrictas para "más cercano", entonces la aplicación es un detalle. – Bozho
justo lo que me preguntaba, también. Pero para todos los contestadores pedantemente correctos que dicen: "Definir el más cercano", tengo uno fácil: el que Java normalmente elegiría (supongo que en la carga de clases). –