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
Atitit.通过null 参数 反射 动态反推方法调用的更多相关文章
- C#反射动态创建实例并调用方法
在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...
- 使用Java反射优化多个方法调用
有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇.前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有N个指标,一个指标就对应一个方法,所以系统代码中就是这样一个情 ...
- java利用反射动态加载方法
@参考文章 根据特定字符串加载相应的方法,有人用if else,有人用switch.参数少了或情况少了还好,很多方法真要命,不要紧,java反射拯救你 import java.lang.reflect ...
- Java 反射 Method的invoke回调调用任意方法
Java 反射 Method的invoke回调调用任意方法 @author ixenos 关键子:Method.Field.invoke方法指针/函数指针.回调函数 invoke回调流程示例 0.由C ...
- C#动态方法调用
此篇将介绍C#如何在运行时动态调用方法.当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的.此篇则给你一把利剑,让动态对象的方法调用成为可能. 1.动态调用dll里的 ...
- C#动态方法调用 提高程序的扩展性
此篇将介绍C#如何在运行时动态调用方法.当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的.此篇则给你一把利剑,让动态对象的方法调用成为可能. 1.动态调用dll里的 ...
- C# 利用反射动态创建对象——带参数的构造函数和String类型
C# 利用反射动态创建对象——带参数的构造函数和String类型 最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好, ...
- Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)
需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现 反射的过程如下: 第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...
- C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)
最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好,特别是当构造函数带参数的时候.MSDN上给出的例子十分复杂,网上的 ...
随机推荐
- ( 转 ) 什么是 JWT -- JSON WEB TOKEN
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- UVA 1514 Piece it together (二分图匹配)
[题目链接] Link [题目大意] 给你一些由一块黑块和两块白块组成的L形拼图,问你是否能够拼成给出的图 [题解] 我们将所有的黑块拆点,拆分为纵向和横向,和周围的白块连边, 如果能够得到完美匹配, ...
- AngularJS的加载执行过程
1. HTML页面的加载,这会触发加载页面包含的所有JS (包括 AngularJS) 2. AngularJS启动,搜寻所有的指令(directive) 3. 找到ng-app,搜寻其指定的模块(M ...
- IOS学习笔记39--NSString各种语法的使用
今天就NSString的各种语法学习学习,以后慢慢补充: 1.字符串的遍历 NSString *string = @"CHENGWULI"; //字符串的长度 int count ...
- mybatis入门基础----动态SQL
原文:http://www.cnblogs.com/selene/p/4613035.html 阅读目录 一:动态SQL 二:SQL片段 三:foreach 回到顶部 一:动态SQL 1.1.定义 m ...
- 腾讯云会话服务器node+nginx
1.除了一个正常的服务器还需要一个会话服务器(websocket),利用node加socket.io来做 2.正常安装Nginx yum install nginx 3.Nginx的配置内容略微不同( ...
- Kubernetes DNS的配置
Kubernetes集群机制通过DNS进行服务名和ip的映射,如果没有配置dns,你可以通过下面命令查询到集群ip kubectl get svc --namespace=kube-system 得到 ...
- iOS:Masonry 英文原档介绍
Masonry 英文原档介绍: Masonry is still actively maintained, we are committed to fixing bugs and merging go ...
- flask admin学习记录
flask admin是flask框架中一个非常好用的后台管理框架,但是由于文档内容太少,经常遇到问题无法解决,这里记录一下 一简单的使用 from flask import Flask from f ...
- hibernate4配置文件hibernate.cfg.xml配置详解
<?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configurat ...