5.java动态代理

Pasted image 20250418212008

1. 动态代理

代理模式Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。而Java的代理机制分为静态代理和动态代理,而这里我们主要重点学习java自带的jdk动态代理机制。

1.1. 创建接口及定义方法

接口

public interface User {  
    void sayc1trus(String name);  
}

创建了 User 接口,定义了 sayc1trus 方法

1.2. 创建一个UserImplement 类

package org.example;

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
  
public class UserImplement implements InvocationHandler {  
    private Object target;  // 被代理的对象

    public UserImplement(Object target) {
        this.target = target;
    }

    @Override  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        System.out.println("方法执行前...");
        Object result = method.invoke(target, args);
        System.out.println("方法执行后...");
        return result;
    }  
}

创建了 UserImplement 类实现 InvocationHandler 接口,这是动态代理的核心处理器
在 UserImplement 类中:

  • 添加了 target 字段来保存被代理对象
  • 实现了构造函数来接收被代理对象
  • 重写了 invoke 方法,在方法执行前后添加了日志输出

1.3. 创建 User 接口的具体实现类

package org.example;

public class UserImpl implements User {
    @Override
    public void sayc1trus(String name) {
        System.out.println("Hello, " + name + "!");
    }
}

创建了 UserImpl 类实现 User 接口
在 UserImpl 中实现了 sayc1trus 方法的具体逻辑

1.4. 创建一个测试类来演示动态代理法

package org.example;

import java.lang.reflect.Proxy;

public class DynamicProxyDemo {
    public static void main(String[] args) {
        // 创建被代理对象
        UserImpl userImpl = new UserImpl();
        
        // 创建代理处理器
        UserImplement handler = new UserImplement(userImpl);
        
        // 创建代理对象
        User userProxy = (User) Proxy.newProxyInstance(
            UserImpl.class.getClassLoader(),
            UserImpl.class.getInterfaces(),
            handler
        );
        
        // 调用代理对象的方法
        userProxy.sayc1trus("c1trus");
    }
}

在 DynamicProxyDemo 类中:

  • 创建被代理对象 UserImpl
  • 创建代理处理器 UserImplement
  • 使用 Proxy.newProxyInstance 创建代理对象
  • 通过代理对象调用方法

安全总结:利用条件分析&执行invoke
安全案例:Ysoserial-CC1链-LazyMap