代码之家  ›  专栏  ›  技术社区  ›  Jonathon Faust

方法中带超类参数的Java getMethod

  •  15
  • Jonathon Faust  · 技术社区  · 16 年前

    鉴于:

    class A
    {
        public void m(List l) { ... }
    }
    

    m 使用反射,将ArrayList作为参数传递给 M :

    List myList = new ArrayList();
    A a = new A();
    Method method = A.class.getMethod("m", new Class[] { myList.getClass() });
    method.invoke(a, Object[] { myList });
    

    这个 getMethod NoSuchMethodException 因为myList的运行时类型是ArrayList,而不是List。

    有没有一种很好的通用方法不需要了解类a的参数类型?

    4 回复  |  直到 14 年前
        1
  •  21
  •   Bozho    16 年前

    如果你知道类型是 List ,然后使用 List.class

    如果你事先不知道类型,想象一下你有:

    public void m(List l) {
     // all lists
    }
    
    public void m(ArrayList l) {
      // only array lists
    }
    

    如果有自动方法,反射应该调用哪个方法?

    Class.getInterfaces() Class.getSuperclass() 但这是具体情况。

    public void invoke(Object targetObject, Object[] parameters,
            String methodName) {
        for (Method method : targetObject.getClass().getMethods()) {
            if (!method.getName().equals(methodName)) {
                continue;
            }
            Class<?>[] parameterTypes = method.getParameterTypes();
            boolean matches = true;
            for (int i = 0; i < parameterTypes.length; i++) {
                if (!parameterTypes[i].isAssignableFrom(parameters[i]
                        .getClass())) {
                    matches = false;
                    break;
                }
            }
            if (matches) {
                // obtain a Class[] based on the passed arguments as Object[]
                method.invoke(targetObject, parametersClasses);
            }
        }
    }
    
        2
  •  2
  •   user207421    16 年前

        3
  •  1
  •   Matt Ball    16 年前

    而不是 myList.getClass() 为什么不直接进来 List.class 你的方法所期望的。

        4
  •  1
  •   Sean Owen    16 年前

    我猜你想 getDeclaredMethods() . 这是一个 example