本帖最后由 kryptolith 于 2011-09-20 15:10:17 编辑

解决方案 »

  1.   

    getDeclaredMethod("run",String.class,int.class);就對了getDeclaredMethod(String name, Class... parameterTypes)後面那個是參數類型
      

  2.   

    getDeclaredMethod(String name, Class... parameterTypes)
    这里的参数应该是 (java.lang.String.class,int.class),它是获取参数的类型。
    你在调用方法的时候才是用new Object[]{"sss", 111}传具体的值。
      

  3.   


    我已经对参数进行了getClass的获型,只是因为原方法是int类型,我获型后是integer类型报错,我是问这个如何解决
      

  4.   


    我已经对参数进行了getClass的获型,只是因为原方法是int类型,我获型后是integer类型报错,我是问这个如何解决
      

  5.   


    我已经对参数进行了getClass的获型,只是因为原方法是int类型,我获型后是integer类型报错,我是问这个如何解决
      

  6.   

    没有自动box,或许是你的jdk版本低于1.5
      

  7.   


    个人感觉原因是,传入的是Object数组,所以里面装的都是对象. int -> Integer不知道对不对.- -.
      

  8.   

    new Object[]{"sss", 111}
    这样声明,编译器肯定报错
      

  9.   

    整体流程是这样的...
    首先有一个方法如下:public String run(String a,int b)
      {
        ...
      }
    然后我调用如下方法反射获得上面的“run”方法:getCacheData("run",new Object[]{"sss", 111});
    此方法内部为:
    getCacheData(String methodName,Object[] parameters)
      {
         ...
         Class oc = o instanceof Class ? (Class)o : o.getClass();
         Object returnValue = invoke(o, methodName, parameters);
      }然后进入自定义的invoke方法,内部结构为:
    private Object invoke(Object o, String methodName,Object[] parameters){
            ...
            try{
                Class[] pcs = null;
                if (parameters != null){
                    pcs = new Class[parameters.length];
                    for (int i = 0; i < parameters.length; i++){
                        pcs[i] = parameters[i].getClass();
                    }
                }
                Class oc = o instanceof Class ? (Class)o : o.getClass();
                Method m = matchMethod(oc, methodName, pcs);
    }这样进入了matchMethod方法,内部调用了如下方法:
    Method method = oc.getDeclaredMethod(methodName, pcs);此方法无法获得"run"方法,调试显示pcs中的第二个参数类型为integer而不是int。
      

  10.   

    parameters[i].getClass();int是沒有getClass方法的。你這樣寫,會自動裝箱成Integer然後返回Integer的class,所以會報錯
      

  11.   

    Integer.TYPE會返回int的class在做基本數據類型的時候做下判斷,分包裝類和基本類型來處理
      

  12.   

    pcs[i] = parameters[i].getClass();
    换成  pcs[i] = parameters[i].class;
    你那样得到的很多基本类型都没有getClass的,理由参照上面
      

  13.   

    Method method = class.getDeclaredMethod(run, new class[] {String.class, int.class})   执行的时候  
    method.invoke(obj, new Object[] {"aaa", 5})
      

  14.   


    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;/** 
     * desc: 
     *     XXX<br> 
     * ---------------------------------------------------------------------------- 
     * ver.            date           who           what 
     * ---------------------------------------------------------------------------- 
     * 0.0.1           2011-9-20       leisore       add 
     * ---------------------------------------------------------------------------- 
     *//**
     * Clz2Book
     * 
     * @author leisore
     * @since version 0.0.1
     */
    public class MatchedMethodTest {    public static void main(String[] args) throws IllegalArgumentException,
                IllegalAccessException, InvocationTargetException {        MatchedMethodTest clz2 = new MatchedMethodTest();
            Object[] parameters = new Object[] { 1, "leisore", new Date() };
            Method findMatchedMethod = findMatchedMethod(clz2, "print", parameters);
            if (findMatchedMethod != null) {
                findMatchedMethod.invoke(clz2, parameters);
            }
        }    public void print(int i, String s, Object o) {
            System.out.println(String.format("i=%d s=%s o=%s", i, s, o));
        }    public static Method findMatchedMethod(Object o, String methodName,
                Object[] parameters) {
            Method matchedMethod = null;
            Method[] declaredMethods = o.getClass().getDeclaredMethods();
            for (int j = 0; j < declaredMethods.length; j++) {
                Method decMethod = declaredMethods[j];
                Class<?>[] parameterTypes = decMethod.getParameterTypes();
                if ((parameterTypes.length == parameters.length)) {
                    boolean matched = true;
                    for (int i = 0; i < parameterTypes.length; i++) {
                        Class<?> paramClz = parameterTypes[i];
                        if (!match0(paramClz, parameters[i])) {
                            matched = false;
                            break;
                        }
                    }
                    if (matched) {
                        matchedMethod = decMethod;
                        break;
                    }
                }
            }        return matchedMethod;
        }    private static Map<Class<?>, Class<?>> prim2wrapperMap = new HashMap<Class<?>, Class<?>>(
                8, 1.0f) {
            {
                put(Boolean.TYPE, Boolean.class);
                put(Byte.TYPE, Byte.class);
                put(Character.TYPE, Character.class);
                put(Short.TYPE, Short.class);
                put(Integer.TYPE, Integer.class);
                put(Long.TYPE, Long.class);
                put(Float.TYPE, Float.class);
                put(Double.TYPE, Double.class);
            }
        };    private static boolean match0(Class<?> decParamClz, Object realParamObj) {
            if (realParamObj == null) {
                return true;
            } else if (decParamClz.isPrimitive()) {
                return prim2wrapperMap.get(decParamClz) == realParamObj.getClass();
            } else if (decParamClz.isArray()) {
                return realParamObj.getClass().isArray()
                        && (decParamClz.getComponentType() == realParamObj
                                .getClass().getComponentType());
            } else {
                return decParamClz.isInstance(realParamObj);
            }
        }
    }
    /**
    输出:
    i=1 s=leisore o=Tue Sep 20 19:26:35 CST 2011
     */没有考虑的很仔细,比如对于一个long参,使用int是可以的等等
      

  15.   

    用的 jdk那个版本 如果1.5以后 是自动装拆箱 应该不会出现上面的问题的