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://blog.csdn.net/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. Java --- JVM动态链接与方法调用

    目录 一.动态链接(指向运行时常量池的方法引用) 二.方法调用 2.1.静态链接 2.2.动态链接 2.3.早期绑定 2.4.晚期绑定 三.虚方法与非虚方法 3.1.非虚方法 3.2.普通调用指令 3 ...

  2. JAVA反射+SOCKET实现远程方法调用

    2019独角兽企业重金招聘Python工程师标准>>> 实现类共有5个: com/chenun/javanet/rmi/RemoteCall.java  //RemoteCall类代 ...

  3. 多态Class对象注册工厂反射动态代理

    运行时类型信息 类型信息(多态&Class对象&注册工厂&反射&动态代理) 一.为什么需要RTTI 二.Class对象 2.1 类字面常量 2.2 泛化的Class引用 ...

  4. java 动态获取类实例化_Java:使用反射动态实例化类

    使用反射动态实例化类,可以在运行时根据参数实例化不同的类,比如使用简单的工厂模式. Factory类: public class Factory { public static Component g ...

  5. (C#)利用反射动态调用类成员[转载]

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  6. 利用反射动态调用类成员C#

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember(    string name ...

  7. C# 利用反射动态调用类成员

    使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下: public object InvokeMember( string name, BindingFla ...

  8. 深入理解Java反射+动态代理,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起在群里探讨技术. 答: ...

  9. 【java】深入分析Java反射-动态代理 proxy

    1.概述 转载:深入分析Java反射(四)-动态代理 [Java]Java 反射机制浅析 [Java]java代理 静态代理 动态代理 proxy [java]静态代理 proxy 2.动态代理的简介 ...

  10. android 动态权限推送图标问题,「JPush」通知栏相关问题

    如果你遇到了通知栏图标显示为白色.机器人:如果你想让通知消息展示大图.能换行.有标题:还想点击消息跳转到具体的页面,那么本文你不可错过 一.通知栏图标显示不正常 1.1 基本说明 极光官网上的图标配置 ...

最新文章

  1. Linux与云计算——第二阶段Linux服务器架设 第八章:FTP服务器架设—安装配置FTP服务和客户端配置...
  2. Javascript-入门
  3. matlab 已知函数值纵坐标值(Y值)获得对应的横坐标
  4. js isinteger_在JavaScript中使用示例使用Number isInteger()方法
  5. WTL 学习博文地址
  6. Windows Forms、MFC、WTL、WxWidgets、Qt、GTK综合比较
  7. 常用模块(json/pickle/shelve/XML)
  8. python数据收集整理教案_《数据收集整理(例1)》教案
  9. 考英语四级误用六级题 千余考生困教室4个小时
  10. .NET框架怎样解决DLL Hell问题?
  11. SAP系统登录以及注册开发人员
  12. Docker离线安装部署文档
  13. 男人成为富翁必备五大特质
  14. Shell脚本工具三剑客 Sed
  15. 凸优化(一)绪论与凸集
  16. Jenkins部署到远程服务器
  17. 将HEX文件通过Keil软件进行下载
  18. c语言五一快乐源码,快乐“五一”
  19. arcgis 出图背景_ArcGIS入门教程来袭,零基础的同学快看过来!
  20. 拼多多买菜入驻永善县了,支持自提!

热门文章

  1. a标签传值到另一个页面_用大头儿子和小头爸爸举例,就讲明白 vue 中父子组件的传值? | 原力计划...
  2. java发送qq邮件_「java发邮件」Java 通过SMTP实现发送QQ邮件 - seo实验室
  3. WCDMA中的基本概念
  4. __declspec(dllimport)和__declspec(dllexport)的区别,以及有关c/c++调用约定
  5. ES 新增字符串方法
  6. 几个linux中有趣的游戏
  7. hive字段名、注释中文显示问号
  8. 《AngularJS高级程序设计》学习笔记
  9. textarea 在 Chrome Safari FireFox 浏览器中禁用拖动和固定大小
  10. 重写系统黑色的TabBar