Java:运行时方法解析

| 我正在通过解释器进行代码的动态调用,并且正在进入方法解析的棘手的丑陋区域,如JLS 15.12节所述。 选择方法的“简便”方法是当您知道所有参数的确切类型时,此时可以使用
Class.getDeclaredMethod(String name, Class[] parameterTypes)
。也许您必须检查方法的可访问性和类的超类/超接口。 但这不涉及以下任何情况,因此它是无用的: 装箱/拆箱原语 亚型 可变参数 空参数(可以是任何类型,除非解释器知道其他情况;在编译时,通过将null转换为类/接口可以消除任何歧义) 原始类型转换(不是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);
    }
}
    
已邀请:
您可能需要阅读此博客文章并查看ClassMate。它应该为您完成大部分繁重的工作。     
Commons beanutils具有此功能来查找匹配方法: getMatchingAccessibleMethod 它可以与原始类型一起使用,但是正如文档所说的那样是不确定的。     
番石榴讨论的一位用户建议我看一下Mirror库。 不幸的是,它也不能处理重载分辨率,至少目前还不能。     
我在MVEL和属性方面取得了一些成功,但是我不记得它是否可以调度方法调用。 但是,您可能正在完全寻找其他语言。考虑到问题的性质,我建议您看一下Groovy,它与Java的集成非常清晰。     

要回复问题请先登录注册