反射都是在 class 上进行的,不是在实例上进行的。
比如 java.lang.Class.getDeclaredMethods()
java.lang.Class.getDeclaredField(String) 返回的都是 java.lang.reflect 包下的对象。
在 JDK 帮助文档,按 ctrl + f ,输入 reflect 找 java.lang.reflect 包下的各个类:Java 中的动态代理要实现一个 InvocationHandler 接口,并实现其中的 invoke 方法,比如:
com.huawei.soa.bdf.midware.impl.esb.connector.BdfServerInner.createServiceProxy()
    Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
上面调用,将返回一个 实现了 interfaces 的类实例,并且调用该实例的接口方法时,实际调用 h 的 invoke(Object, Method, Object[]) 方法。比如:
        MyBusinessOperationInnerService service = (MyBusinessOperationInnerService) ServiceHelper
                .getInnerService("com.huawei.bes.om.base.order.MyBusinessService");
        service.findLocalCUPreActivityTriggerBP(123, "whz");
上面的代码,实际调用 BdfServiceProxy.invoke()方法,Object 为 service,method 为 public abstract java.lang.String com.huawei.bes.om.base.order.MyBusinessOperationInnerService.findLocalCUPreActivityTriggerBP(java.lang.Integer,java.lang.String) ,args 为 [123, "whz"]
com.huawei.soa.bdf.midware.impl.esb.connector.BdfServerInner.getClazz(String)
    Class<?> clazz = ClassUtils.forName(ClassName name, ClassLoader loader)
上面返回 name 类或接口的 clazz,通过他可以生成该类的类实例:
Class<?> clazz = Class.forName(strategy);
Object object = clazz.newInstance();
Method method = clazz.getMethod("charge", String.class, int.class); //$NON-NLS-1$
Object invoke = method.invoke(object, msisdn, time);
return ((Integer)invoke).intValue();

解决方案 »

  1.   

    根据方法名(字符串),找到 Method 对象,通过Method 对象,调用实例方法:
    com.huawei.soa.bdf.util.MethodUtil.invoke(String, String, Object, Object...)
                // 判断方法名相同,不支持同名方法重载
                for (Method m : instance.getClass().getMethods())
                {
                    if (StringUtils.equals(m.getName(), operationName))
                    {
                        method = m;
                        metMap.put(methodKey, method);
                        break;
                    }
                }
        java.lang.reflect.Method.invoke(Object instance, Object... args)