代理模式Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。而Java的代理机制分为静态代理和动态代理,而这里我们主要重点学习java自带的jdk动态代理机制。
接口
public interface User {
void sayc1trus(String name);
}
创建了 User 接口,定义了 sayc1trus 方法
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 类中:
package org.example;
public class UserImpl implements User {
@Override
public void sayc1trus(String name) {
System.out.println("Hello, " + name + "!");
}
}
创建了 UserImpl 类实现 User 接口
在 UserImpl 中实现了 sayc1trus 方法的具体逻辑
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 类中:
安全总结:利用条件分析&执行invoke
安全案例:Ysoserial-CC1链-LazyMap