CC2链的原理
1,调用链分析
-
搜索PriorityQueue,PriorityQueue.java的60行左右,打开结构试图搜索readObject[PriorityQueue.java]
-
heapify()[PriorityQueue.java]
-
siftDown[PriorityQueue.java]
-
siftDownUsingComparator[PriorityQueue.java]
-
comparator.compare,点击comparator[PriorityQueue.java]
-
Comparator<? super E> comparator,点击Comparator[PriorityQueue.java]
-
Comparator
,这是一个接口,展开接口[Comparator.java] -
点击TransformingComparator
-
观察上面的注释
See Also: Comparable, Serializable
-
思路点
-
comparator.compare替换为TransformingComparator.compare
-
展开结构试图,搜索compare[TransformingComparator.java]
-
O value1 = (O)this.transformer.transform(obj1);,点击transformer[TransformingComparator.class]
-
private final Transformer<? super I, ? extends O> transformer; ,transformer属于Transformer这种类型[TransformingComparator.class]
- 思路点this.transformer.transform ~> this.Transformer.transform
- 找同类型 this.Transformer.transform ~> this.InvokerTransformer.transform
-
全局搜索InvokerTransformer[InvokerTransformer.java]
- 如果如果不能搜到三方包含的关键词,Maven侧边栏第三个下载图标展开,点击Download Sources
- 然后再进行搜索,点击@version $Id: InvokerTransformer.java,观察类结构
- public class InvokerTransformer<I, O> implements Transformer<I, O>, Serializable
-
展开结构视图,搜索transform[InvokerTransformer.java]
- 思路点 input ~> TemplatesImpl,iMethodName ~> newTransformer
-
全局搜索TemplatesImpl,定位到$Id: TemplatesImpl.java[TemplatesImpl.java]
- 观察继承 public final class TemplatesImpl implements Templates, Serializable
-
展开结构试图,搜索newTransformer[TemplatesImpl.java]
-
getTransletInstance()[TemplatesImpl.java]
-
defineTransletClasses(),条件控制_name != null[TemplatesImpl.java]
-
_class[i] = loader.defineClass(_bytecodes[i])[TemplatesImpl.java]
CC4链的原理
1,CC4链的分析
-
搜索PriorityQueue,PriorityQueue.java的60行左右,打开结构试图搜索readObject[PriorityQueue.java]
-
heapify()[PriorityQueue.java]
-
siftDown[PriorityQueue.java]
-
siftDownUsingComparator[PriorityQueue.java]
-
comparator.compare,点击comparator[PriorityQueue.java]
-
Comparator<? super E> comparator,点击Comparator[PriorityQueue.java]
-
Comparator
,这是一个接口,展开接口[Comparator.java] - 点击TransformingComparator.java
- 观察接口public class TransformingComparator<I, O> implements Comparator, Serializable
- 思路点comparator.compare ~> TransformingComparator.compare
-
展开结构试图,搜索compare[TransformingComparator.java]
-
O value1 = (O)this.transformer.transform(obj1);,点击transformer[TransformingComparator.class]
-
private final Transformer<? super I, ? extends O> transformer; ,transformer属于Transformer这种类型[TransformingComparator.class]
- 思路点this.transformer.transform ~> this.Transformer.transform
- 找同类型 this.Transformer.transform ~> this.ChainedTransformer.transform
-
全局搜索ChainedTransformer[ChainedTransformer.java]
- 如果如果不能搜到三方包含的关键词,Maven侧边栏第三个下载图标展开,点击Download Sources
- 然后再进行搜索,点击Version:$Id: ChainedTransformer.java,观察类结构
- public class ChainedTransformer
implements Transformer<T, T>, Serializable
-
展开结构视图,搜索transform[ChainedTransformer.java]
-
final Transformer<? super T, ? extends T> iTransformer : iTransformers,单击 iTransformers
-
private final Transformer<? super T, ? extends T>[] iTransformers,iTransformers属于Transformer
-
object = iTransformer.transform(object);
- 思路点iTransformer.transform ~> Transformer.transform
- Transformer.transform ~> ConstantTransformer.transform
-
-
全局搜索ConstantTransformer, 点击Version:$Id: ConstantTransformer.java[ConstantTransformer.java]
- public class ConstantTransformer<I, O> implements Transformer<I, O>, Serializable, 观察类ConstantTransformer属于Transformer
-
展开结构视图,搜索transform[ConstantTransformer.java]
- 思路点ConstantTransformer.transform ~> InstantiateTransformer.transform
-
全局搜索InstantiateTransformer, 点击$Id: InstantiateTransformer.java, 结构视图展开搜索transform[InstantiateTransformer.java]
- final Constructor<? extends T> con = input.getConstructor(iParamTypes); return con.newInstance(iArgs);
- transform方法中, 控制input = TrAXFilter
CC5链的原理(半懂)
1, CC5链的分析
- BadAttributeValueExpException, 全局搜索; 点击public class BadAttributeValueExpException[BadAttributeValueExpException.java]
- 打开结构视图,找反序列化默认执行的点readObject[BadAttributeValueExpException.java]
- val = valObj.toString(), valObj由private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException的ois参数控制[BadAttributeValueExpException.java]
- 构思TiedMapEntry.toString(), ois = TiedMapEntry,调用TiedMapEntry.toString
- 全局搜索TiedMapEntry, 点击Version:$Id: TiedMapEntry.java[TiedMapEntry.java]
- 展开结构视图搜索toString()[TiedMapEntry.java]
- 进入getKey()[TiedMapEntry.java]
- 同为序列化可触发的方法, 往下看getVlue(), map.get(key), map是java里类似于路由导航的东西, 找一个继承map类的接口就能控制它, 点击map[TiedMapEntry.java]
- 由此构思LazyMap.get()
- 全局搜索LazyMap, 定位60行左右, 点击Version:$Id: LazyMap.java[LazyMap.java]
- 打开结构视图, 搜索get[LazyMap.java]
- public class LazyMap<K, V> extends AbstractMapDecorator<K, V> implements Serializable, 找到类的定义, 它继承map类
- final V value = factory.transform(castKey);, 点击factory,
- protected final Transformer<? super K, ? extends V> factory;, 发现它继承自Transformer, 少了个反序列化接口
- 由此构思ChainedTransformer.transform()
CC7链的原理
1, CC7链的分析
-
Hashtable全局搜索, 展开结构视图, 搜索readObject[Hashtable.java]
-
reconstitutionPut(table, key, value);[Hashtable.java]
- for (Entry e = tab[index] ; e != null ; e = e.next), 点击Entry
- private static class Entry<K,V> implements Map.Entry<K,V>, 发现它继承了Map
-
e.key.equals(key)[Hashtable.java]
- 分析, Map声明的变量为e, 所以e.key.equals(key)
- 构造AbstractMapDecorator.equals
-
搜索AbstractMapDecorator,$Id: AbstractMapDecorator.java[AbstractMapDecorator.java]
-
结构视图, 定位equals[AbstractMapDecorator.java]
-
点击decorated()[AbstractMapDecorator.java&equals]
- 发现decorated()方法继承了Map接口
- 创造了构思AbstractMap.equals的条件
-
全局搜索AbstractMap, 先定位引入了该包的文件, 确保一致点入[AbstractMap.java]
-
结构视图定位equals[AbstractMap.java]
-
Map m = (Map) o;, 发现它继承了map类[AbstractMap.java&equals]
- 思路点LazyMap.get,
- Ctrl+F搜索get, 获取构造方法
- if (!(m.get(key)==null && m.containsKey(key)))