然后通过类名.class反射获取到了Runtime对象
接下来就是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参数类型如下
接下来我们进去InvokerTransformer.class内部查看一下代码怎么执行的
这边需要回顾一下getMethod方法的使用
点击查看另外一篇文章操作成员方法
由此我们知道getMethod第一个参数是要调用方法的名称,第二个是要执行的参数类型
invoke第一个参数是获取到的class对象,接下来就是按照对应格式传入参数
这边就非常清楚了,调用java.lang.Runtime里面的getRuntime方法,获取到对象
接下来的几个InvokerTransformer也是一样的,就不细细分析了
0x04、第二部分分析这边是链式调用,什么是链式调用函数
想深入了解的可以看看这边文章https://www.jb51.net/article/49405.htm
经过ChainedTransformer
会依次执行Transformer[]数组里面的方法,最后变成如下这段代码
((Runtime)Runtime.class.getMethod("getRuntime",null).invoke(null,null)).exec("calc.exe");最后再创建一个Map,并传入键值对,通过decorate方法
这边可以看到第一个是map,也就是我们上面创建的map,然后就是Transformer[]数组,在返回回来
最后你会疑问,咋返回的Map跟上面没区别?
这时候可以百度一下LazyMap是怎么回事的