Java: resolución del método de tiempo de ejecución

Estoy trabajando en una invocación dinámica de código a través de un intérprete, y me estoy metiendo en las áreas feas y pegajosas de la resolución de métodos como se discutió enJLS sección 15.12.

a forma "fácil" de elegir un método es cuando conoce los tipos exactos de todos los argumentos, momento en el que puede usarClass.getDeclaredMethod(String name, Class[] parameterTypes). Tal vez tenga que verificar la accesibilidad del método y las superclases / superinterfaces de la clase.

Pero esto no cubre ninguno de los siguientes casos, por lo que es inútil:

primitivas de boxeo / unboxing subtipos varargsun argumento nulo (que puede ser de cualquier tipo, a menos que el intérprete sepa lo contrario; en tiempo de compilación se eliminaría cualquier ambigüedad al convertir nulo en una clase / interfaz)onversión de tipo @primitive (no es parte de Java, pero se permite en el contexto de idiomas, por ejemplo, Rhino Javascript donde todos los números son de coma flotante, por lo que el código de Java puede tomint pero la persona que llama pasa un número que es unint o undouble)

(vea a continuación un ejemplo rápido de los primeros tres)

Así que ahora tengo que escribir mi propia biblioteca de resolución de métodos ...

¿Existe alguna biblioteca marco conocida para ayudar en esto?

package com.example.test.reflect;

import java.lang.reflect.Method;

public class MethodResolutionTest {
    public void compute(int i)              { /* implementation... */ }
    public void compute(Long l)             { /* implementation... */ }
    public void compute(Object obj)         { /* implementation... */ }
    public void compute(String... strings)  { /* implementation... */ }

    public static void main(String[] args) {
        Class<?> cl = MethodResolutionTest.class;

        /* these succeed */
        findAndPrintMethod(cl, "compute", int.class);
        findAndPrintMethod(cl, "compute", Long.class);
        findAndPrintMethod(cl, "compute", Object.class);
        findAndPrintMethod(cl, "compute", String[].class);

        /* these fail */
        findAndPrintMethod(cl, "compute", Integer.class);
        findAndPrintMethod(cl, "compute", long.class);
        findAndPrintMethod(cl, "compute", MethodResolutionTest.class);
        findAndPrintMethod(cl, "compute", String.class, String.class);
    }
    private static void findAndPrintMethod(Class<?> objectClass, 
            String methodName, Class<?>... parameterTypes) 
    {
        try {
            Method method = findMethod(objectClass, methodName, 
                   parameterTypes);
            System.out.println(method.toString());
        }
        catch (SecurityException e) {
            e.printStackTrace();
        }
        catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
    private static Method findMethod(Class<?> objectClass, 
            String methodName, Class<?>[] parameterTypes) 
        throws SecurityException, NoSuchMethodException 
    {
        return objectClass.getDeclaredMethod(methodName, parameterTypes);
    }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta