反射都是在 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();
比如 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();
解决方案 »
- 为什么我的jdk卸载不了
- 在struts2中怎么实现action和servlet共用session
- 初学者:J2EE该安装哪些软件
- 如何用java根据xml文件的schema来建立数据库的表,建表后要把xml的数据写到数据库的!大家有什么办法?急~~~~
- 请教高手:字节流和字符串转换的问题
- 有人朋友做过这个东西,想了好久不知道如何解决,谢谢了!!!!
- 求权限管理Struts+Hibernate源代码
- 欢迎有志之士加入JAVA技术群.........
- hibernate入门问题:多对多的关系怎么联系??我实在不行了。
- 项目外包:连锁POS系统
- 这道面试题让我折戟沉沙了
- 这个是什么时间格式:2015-10-05T21:02:49.228Z?
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)