Commons Collections1分析 (2)

Commons Collections1分析

然后通过类名.class反射获取到了Runtime对象

Commons Collections1分析

接下来就是InvokerTransformer;通过前置知识铺垫,我们知道第⼀个参数是待执⾏的⽅法名第⼆个参数

是这个函数的参数列表的参数类型第三个参数是传给这个函数的参数列表

new InvokerTransformer("getMethod", new Class[] {String.class, Class[].class }, new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] {Object.class, Object[].class }, new Object[] {null, new Object[0] }), new InvokerTransformer("exec", new Class[] {String.class }, new Object[] {"calc.exe"}) getMethod, null, getRuntime invoke , null, null exec , null, calc.exe

参数类型如下

Commons Collections1分析

接下来我们进去InvokerTransformer.class内部查看一下代码怎么执行的

Commons Collections1分析

这边需要回顾一下getMethod方法的使用

点击查看另外一篇文章操作成员方法

Commons Collections1分析

由此我们知道getMethod第一个参数是要调用方法的名称,第二个是要执行的参数类型

invoke第一个参数是获取到的class对象,接下来就是按照对应格式传入参数

Commons Collections1分析

这边就非常清楚了,调用java.lang.Runtime里面的getRuntime方法,获取到对象

接下来的几个InvokerTransformer也是一样的,就不细细分析了

0x04、第二部分分析

Commons Collections1分析

这边是链式调用,什么是链式调用函数

想深入了解的可以看看这边文章https://www.jb51.net/article/49405.htm

经过ChainedTransformer

Commons Collections1分析

会依次执行Transformer[]数组里面的方法,最后变成如下这段代码

((Runtime)Runtime.class.getMethod("getRuntime",null).invoke(null,null)).exec("calc.exe");

Commons Collections1分析

最后再创建一个Map,并传入键值对,通过decorate方法

Commons Collections1分析

这边可以看到第一个是map,也就是我们上面创建的map,然后就是Transformer[]数组,在返回回来

Commons Collections1分析

最后你会疑问,咋返回的Map跟上面没区别?

这时候可以百度一下LazyMap是怎么回事的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppgsj.html