代理
代理的意义在于生成代理对象,在服务提供方和使用方之间充当一个媒介,控制真实对象的访问的同时,添加额外功能,而无侵入性。
代理分为静态代理和动态代理两种。
静态代理需要通过手动或工具生成代理类并编译,代理类和委托类的关系在编译期就已经确定。动态代理允许开发人员在运行时动态的创建出代理类及其对象。
静态代理
静态代理的实现需要一个接口(表示要完成的功能),一个真实对象和一个代理对象(两者都需实现这个接口)。
interface Shopping {
void buy();
}
class Client implements Shopping {
public void buy() {
System.out.println("我想买这件商品");
}
}
class StaticProxy implements Shopping {
private Shopping shopping;
public StaticProxy(Shopping shopping) {
this.shopping = shopping;
}
public void buy() {
System.out.println("降价促销,疯狂大甩卖了!");
shopping.buy();
}
}
public class StaticProxyTest {
public static void main(String[] args) {
Client client = new Client();
StaticProxy service = new StaticProxy(client);
service.buy();
}
}
动态代理
动态代理可以让我们在运行时动态生成代理类,解耦程度更高。Java 动态代理的实现主要借助于 java.lang.reflect 包中的 Proxy 类与 InvocationHandler 接口,所有对动态代理对象的方法调用都会转发到 InvocationHandler 中的 invoke() 方法中实现。一般我们称实现了 InvocationHandler 接口的类为调用处理器。
我们可以通过 Proxy 的静态工厂方法 newProxyInstance 创建动态代理类实例。
public class Test{
public static void main(String[] args){
Shopping client = new Client();
DynamicProxy dyProxy = new DynamicProxy(client);
Shopping shop = (Shopping) Proxy.newProxyInstance(Shopping.class.getClassLoader(), new Class[]{Shopping.class}, dyProxy);
shop.buy();
}
}
interface Shopping {
void buy();
}
class Client implements Shopping {
public void buy() {
System.out.println("我想买这件商品");
}
}
class DynamicProxy implements InvocationHandler {
private Object target = null;
DynamicProxy(Object target) {
this.target = target;
}
/**
* 代理方法逻辑
*
* @param proxy 代理对象
* @param method 调度方法
* @param args 调度方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前");
method.invoke(target, args);
System.out.println("代理后");
return null;
}
}
Proxy
Object | static newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) | 获得指定接口代理类 |
Class<?> | getProxyClass | 构造实现指定接口的代理类的一个新实例。 所有方法会调用给定处理器对象的 invoke 方法 |
boolean | static isProxyClass(Class<?> cl) | 判断是否是一个代理类 |
参考
https://blog.csdn.net/weixin_43320847/article/details/82938754
Java核心技术卷I