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

Atitit.通过null 参数 反射  动态反推方法调用的更多相关文章

  1. C#反射动态创建实例并调用方法

    在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...

  2. 使用Java反射优化多个方法调用

    有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇.前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有N个指标,一个指标就对应一个方法,所以系统代码中就是这样一个情 ...

  3. java利用反射动态加载方法

    @参考文章 根据特定字符串加载相应的方法,有人用if else,有人用switch.参数少了或情况少了还好,很多方法真要命,不要紧,java反射拯救你 import java.lang.reflect ...

  4. Java 反射 Method的invoke回调调用任意方法

    Java 反射 Method的invoke回调调用任意方法 @author ixenos 关键子:Method.Field.invoke方法指针/函数指针.回调函数 invoke回调流程示例 0.由C ...

  5. C#动态方法调用

    此篇将介绍C#如何在运行时动态调用方法.当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的.此篇则给你一把利剑,让动态对象的方法调用成为可能. 1.动态调用dll里的 ...

  6. C#动态方法调用 提高程序的扩展性

    此篇将介绍C#如何在运行时动态调用方法.当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的.此篇则给你一把利剑,让动态对象的方法调用成为可能. 1.动态调用dll里的 ...

  7. C# 利用反射动态创建对象——带参数的构造函数和String类型

    C# 利用反射动态创建对象——带参数的构造函数和String类型 最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好, ...

  8. Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)

    需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现   反射的过程如下:     第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...

  9. C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)

    最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好,特别是当构造函数带参数的时候.MSDN上给出的例子十分复杂,网上的 ...

随机推荐

  1. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

  2. [Contest20180313]灵大会议

    为了方便才用lct,没想到最后要加读入优化才能过... 有一个结论就是在一条链上,如果能找到一个点使得这个点划分链左右两边的树节点权值和最相近,那么这个点就是答案 用lct维护,每个splay节点存树 ...

  3. 【置换群】CH Round #63 - OrzCC杯#2省选热身赛 exchange

    第一问置换群裸题. 第二问单独考虑某个循环,任意交换两个元素,稍微画一下就会发现,把该循环拆成了2个,剩下所需的交换次数减少了1,也就是说,第一步我们任意交换,都能够保证交换次数最少.于是一个循环的答 ...

  4. 【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫

    暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优. 但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处 ...

  5. 【KM算法】HDU2255-奔小康赚大钱

    KM算法的裸体.O(n^4)的模板,实际上在增广路径的时候依然有冗余,可以用bfs优化到O(n^3). #include <iostream> #include <cstdio> ...

  6. pythonGUI编程用Canvas模拟画板

    代码如下: from tkinter import * import webbrowser root = Tk() w = Canvas(root,width=400,height=200) w.pa ...

  7. 在xcode6中使用矢量图(iPhone6置配UI)

    转载出处:http://blog.xoneday.com ios应用程序是一个图像主导的产品.在开发一个应用程序时,你需要各种尺寸的图标,你需要为每个图像文件制作一个@1x尺寸和一个@2x尺寸.这样你 ...

  8. Windows 无法验证此设备所需的驱动程序的数字签名。某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件。(代码52)

    由未签名驱动导致的键鼠装无法使用的问题 usb 问题失效. 要是win 10的话  导致的结果就是 无线键鼠套装无法使用. 解决办法是 1.按下shift 按键 点击重启按钮 重启后 2.疑难解答-- ...

  9. Centos7下ZABBIX安装全记录

    安装之前务必关闭SELINUX Install Repository with MySQL database : rpm -i https://repo.zabbix.com/zabbix/3.4/r ...

  10. 精通JavaScript攻击框架:AttackAPI

    多年来客户端安全一直未引起人们的足够重视,但是如今情况发生了急剧转变,客户端安全已经成为信息安全领域的焦点之一.Web恶意软件.AJAX蠕虫.浏览历史暴破.登录检测.傀儡控制技术网络端口扫描以及浏览器 ...