хм, я "застрял" с Java по разным причинам, самой большой из которых является удобство сопровождения (добавление другого языка значительно ограничивает мою способность получать помощь от других разработчиков)

отаю над некоторым динамическим вызовом кода через интерпретатор, и я вхожу в неприятные области разрешения методов, как обсуждалось вJLS раздел 15.12.

«Простой» способ выбрать метод - это когда вы знаете точные типы всех аргументов, и в этот момент вы можете использоватьClass.getDeclaredMethod(String name, Class[] parameterTypes), Возможно, вам нужно проверить доступность метода и суперклассы / суперинтерфейсы класса.

Но это не охватывает ни одного из следующих случаев, поэтому это бесполезно:

бокс / распаковка примитивовподтипыпеременные аргументынулевой аргумент (который может быть любого типа, если интерпретатор не знает иначе; во время компиляции любая неоднозначность была бы устранена путем преобразования нуля в класс / интерфейс)преобразование примитивного типа (не является частью Java, но допустимо в контексте языков - например, Rhino Javascript, где все числа с плавающей запятой, поэтому код Java может занятьint но абонент передает номер, который является либоint илиdouble)

(см. ниже для быстрого примера первых трех)

Так что теперь я должен написать свою собственную библиотеку разрешения методов ...

Есть ли какая-нибудь известная библиотека фреймворков, чтобы помочь в этом?

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