Atitit.通过null 参数 反射 动态反推方法调用
Atitit.通过null 参数 反射 动态反推方法调用
此时,直接使用java apache的ref工具都失效了。必须要自己实现了。
如果调用接口方法的话,就不能使用apache的ref工具,可以使用java的ref。。
思路流程
首先,通过参数 反推Class<?>[] paramTypes, 然后调用api
如果为null ,使用methodname where by name集合,如果只有一个最好了。
{
然后判断参数个数,如果不符合,抛出异常。
}
如果不为一个,则跑出异常。。模糊不能精确确定内个method
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
@SuppressWarnings("all")
private <ttx> void invokeinterface(Class<ttx> class1, String meth,
int paramNum) {
Object[] objs_tmp = VmUtil.pop2objArr(stack, paramNum);
Object o = objs_tmp[paramNum - 1];
Object[] params = AArrays.left(objs_tmp, paramNum - 1);
ttx t = (ttx) o;
// try {
// Object ret = MethodUtils.invokeMethod(t, meth, params);
// stack.push(ret);
// } catch (NoSuchMethodException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// } catch (IllegalAccessException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// } catch (InvocationTargetException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
try {
Method m1 = refx.getMeth(class1, meth, params);
Object ret = m1.invoke(o, params);
stack.push(ret);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static Method getMeth(Class<? extends Object> class1, String meth, Object[] params) {
Class<?>[] paramTypes =refx. getParamTypes(params);
Method m=getMethByParamTypes(class1,meth, paramTypes);
if(m==null)
m=getMethByParams(class1,meth,params);
return m;
}
private static Method getMethByParamTypes(
Class<? extends Object> class1, String meth, Class<?>[] paramTypes) {
try {
return class1.getMethod(meth, paramTypes);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
System.out.println("---------warning...");
e.printStackTrace();
return null;
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
*/
private static Method getMethByParams(Class<? extends Object> class1,
String meth, Object[] params) {
List<Method> li=Lists.newArrayList();
Method[] ma=class1.getDeclaredMethods();
for (Method method : ma) {
if(method.getName().equals(meth))
{
Class<?>[] paramTypes=method.getParameterTypes();
if(suitParamNtypes( params,paramTypes))
li.add(method);
}
}
if(li.size()>1) {
String string = "The method @m@(..) is ambiguous for the type @cls@".replace("@m@", meth).replace("@cls@", class1.getName());
throw new RuntimeException(string);
}
return li.get(0);
}
private static boolean suitParamNtypes(Object[] params,
Class<?>[] paramTypes) {
if (params.length != paramTypes.length)
return false;
for (int i = 0; i < paramTypes.length; i++) {
if (params[i] == null)
continue;
if (params[i].getClass() != paramTypes[i])
return false;
}
return true;
}
---end
相关文章
- 【Android】Intent介绍及Intent在Activity中的使用方法
- 调用反射类的指定方法
- 调用反射类的指定方法
- 调用反射类的方法
- 调用反射类的方法
- 6-1python语法基础-面向对象-类的定义属性和方法,类的作用域,类的封装继承多态,类的反射,单例模式
- js中几种实用的跨域方法原理详解
- java反射机制,通过类名获取对象,通过方法名和参数调
- 6-1python语法基础-面向对象-类的定义属性和方法,类的作用域,类的封装继承多态,类的反射,单例模式
- 佳能MP258的5200错误和P08代码解决方法及清零方法
- Qt通用方法及类库8
- TIF、JPG图片手动添加地理坐标的方法
- ConcurrentHashMap原理分析(1.7与1.8)-put和 get 需要执行两次Hash 多线程一起put的自旋锁问题还有 计算size 先不加锁计算3次,如果不对再给每个segment加锁计算一次,在JDK1.8版本中,对于size的计算,在put的扩容和addCount()方法就已经计算好了,直接给你(阿里)
- SAP WebClient UI drop down list(下拉列表)的一个故障和解决方法
- atitit.技术选型方法总结为什么java就是比.net有前途
- Map集合使用get方法返回null抛出空指针异常问题
- 097:vue+openlayers: 非4326,3857的投影方法 (示例代码)
- Android 得到函数耗时多少的方法(七十四)
- Spring MVC参数方法名称解析器
- 阿里云服务器包年包月/按量计费/抢占式实例模式选择方法