5.java动态代理

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