• JDK动态代理在反序列化中的应用


    简介

    代理是一种设计模式,不修改原有的类,增加一些功能,例如记录日志等。
    静态代理:被代理的类有几个方法,代理类就得实现几个方法,而且代理类新增的功能可能都是一致的,要在这些方法里面重复写。
    动态代理:少量的代码,适配性更强。不需要实现被代理类的所有接口,可以动态获取。不管外部掉什么方法都会执行动态代理的invoke方法。

    动态代理在反序列化中的作用

    1. readObject在反序列化时会自动执行,动态代理的invoke在函数调用的时候也是会自动执行。在漏洞利用的时候,找不到明显的显式调用,那么就可以使用这种隐式调用。
    2. 可以拼接两条链,不管前面执行任意的方法,后面都会走到固定的地方。
    3. 在CC第一条链和jdk7u21那两条链使用了动态代理。

    代码示例

    package com.duziteng.springbootdemo.test.proxy;
    
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
            IUser user = new IUserImpl();
            //静态代理,可以直接使用IUserImpl的show方法,但是通过IUserProxy代理方式进行调用,顺便加一些记录日志等操作。
            //缺点:被代理的类有几个方法,代理类就得实现几个方法,而且代理类新增的功能可能都是一致的,要在这些方法里面重复写。
    //        IUserProxy userProxy = new IUserProxy(user);
    //        userProxy.show();
    
            //动态代理,少量的代码,适配性更强。不需要实现被代理类的所有接口,可以动态获取
            IUser userProxy = (IUser) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{IUser.class}, new UserInvocationHandler(user));//classLoad、要代理的接口、要做的事情
            userProxy.update();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    Sentinel概述
    ubuntu上ffmpeg使用framebuffer显示video
    达梦数据库指定索引
    linux 文件锁
    设计模式 22 访问者模式 Visitor Pattern
    30岁从事软件测试,目前已失业4个月,迷茫不知该怎么办。?
    深入Spring 5 事务原理与源码分析【精品分享】
    力扣上《将数字变成0的操作次数》这道题num & 0x01和num >>= 1的讲解
    自然语言处理的多行业应用
    ELK集群安装
  • 原文地址:https://blog.csdn.net/weixin_42974824/article/details/126328809