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)))