Java:获取带有接口(interface)参数的方法及其实现

标签 java reflection

我想调用具有参数接口(interface)的方法(使用反射)——即:List 但带有 L​​ist 的实现。 例如:

public class Test {

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = Test1.class.getMethod("method", new Class[]{ArrayList.class});

    }

    public class Test1 {

        public void method(List list) {
            System.out.println("method");
        }
    }
}

我得到 NoSuchMethodException。在这种情况下,我知道我得到了哪些参数,问题是当我不“静态”知道参数类型时,我想一般地使用它。

getMethod 是否也返回以接口(interface)为参数的方法?或者我必须编写自己的“方法搜索器”

谢谢。

编辑: 这要复杂得多。我正在尝试在我的程序中编写类似“动态模块化体系结构”的内容。我有核心,它应该与其他模块通信。所以我在编程时不知道参数类,但在运行时。

 public Object processMessage(String target, String methodName, List<Object> params, Object returnNonExist) {
    Module m = modules.get(target);
    if (m == null) {
        return returnNonExist;
    } else {
        Class[] paramsTypes = new Class[params.size()];
        for (int i = 0; i < params.size(); i++) {
            paramsTypes[i] = params.get(i).getClass();
            }
        }
        try {
            Method method = m.getClass().getMethod(methodName, paramsTypes);
            Object result = method.invoke(m, params.toArray());
            return result;
        }

更好吗?

最佳答案

我可能找到了解决方案——我必须编写自己的“方法搜索器”,它尊重接口(interface)实现和父类(super class)。它看起来像这样:

public static Method findMethod(Object m, String methodName, Class[] paramsTypes) {
    Method[] metody = m.getClass().getDeclaredMethods();
    List<Method> sameNames = new ArrayList<Method>();
    // filter other names
    for (Method meth : metody) {
        if (meth.getName().equals(methodName)) {
            sameNames.add(meth);
        }
    }
    // lets find best candidate
    if (sameNames.isEmpty()) {
        return null;
    } else {
        // filter other count of parameters
        List<Method> sameCountOfParameters = new ArrayList<Method>();
        for (Method meth : sameNames) {
            if (meth.getParameterTypes().length == paramsTypes.length) {
                sameCountOfParameters.add(meth);
            }
        }
        if (sameCountOfParameters.isEmpty()) {
            return null;
        } else {
            for (Method meth : sameCountOfParameters) {
                // first one, which is suitable is the best
                Class<?>[] params = meth.getParameterTypes();
                boolean good = true;
                for (int i = 0; i < params.length && good; i++) {
                    if (params[i].isInterface() && Arrays.asList(paramsTypes[i].getInterfaces()).contains(params[i])) {
                        //if i-th paramater type is Interface and we search method with its implementation
                        good = true;
                        continue;
                    } else {
                        // if we call it with subclass and parameter typ is superclass
                        if (paramsTypes[i].getSuperclass().equals(params[i])) {
                            good = true;
                            continue;
                        }
                    }
                    good = false;
                }
                if (good) {
                    return meth;
                }
            }
        }
    }
    return null;
}

我在标准 getMethod 抛出“NoSuchMethodException”后使用它(在大约 5% 的情况下,所以我不关心速度。

关于Java:获取带有接口(interface)参数的方法及其实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19313259/

相关文章:

java - 从 JMeter SampleResult 响应中提取数据

Java:ExceptionInInitializerError 创建使用自定义类加载器加载的 Clojure 编译类的新实例

c# - GetType() 和 GetTypes() 等反射 API 的性能如何?

android - 移除@Override 注解错误

java - 没有 session.getTransaction 方法不存在

java - 如何在 Java Swing 中导出图像而不显示它

c# - 动态 JContainer (JSON.NET) & 在运行时迭代属性

c# - 获取 StringLength 值的扩展方法

go - 使用反射附加到 slice

java - HQL 无法理解一个类的属性是另一个类的集合