目录
1、是什么?
代理(Proxy):即代替处理,类似于中间人这一角色。
调用如何在客户端无感(动态代理)
基于动态代理生成代理对象,当调用代理对象的方法时,由代理进行相关信息(方法、参数等)的组装并发送到服务器进行远程调用,并由代理接收调用结果并返回。
1.1 动态代理和静态代理的区别
静态代理的代理对象和被代理对象在代理之前就已经确定,它们都实现相同的接口或继承相同的抽象类。静态代理模式一般由业务实现类和业务代理类组成,业务实现类里面实现主要的业务逻辑,业务代理类负责在业务方法调用的前后作一些你需要的处理,以实现业务逻辑与业务方法外的功能解耦,减少了对业务方法的入侵。静态代理又可细分为:基于继承的方式和基于聚合的方式实现。
静态代理模式的代理类,只是实现了特定类的代理,代理类对象的方法越多,你就得写越多的重复的代码。动态代理就可以动态的生成代理类,实现对不同类下的不同方法的代理。
JDK 动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用业务方法前调用InvocationHandler
处理。代理类必须实现 InvocationHandler
接口,并且,JDK 动态代理只能代理实现了接口的类
2、怎么用
使用 JDK 动态代理类基本步骤:
1、编写需要被代理的类和接口
2、编写代理类,需要实现 InvocationHandler
接口,重写 invoke()
方法;
3、使用Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
动态创建代理类对象,通过代理类对象调用业务方法。
3、举例
3.1 创建接口
public interface Demo {
String hello(String msg);
}
3.2 创建实现类
public class DemoImpl implements Demo{
@Override
public String hello(String msg) {
System.out.println("msg="+msg);
return "hello";
}
}
3.3 创建代理类
public class DemoProxy implements InvocationHandler {
Demo demo;
public DemoProxy(Demo demo){
this.demo=demo;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始之前");
Object value=method.invoke(demo,args);
System.out.println("开始之后");
return value;
}
}
3.4 测试
public static void main(String[] args) {
DemoProxy proxy=new DemoProxy(new DemoImpl());
Demo demo= (Demo) Proxy.newProxyInstance(
Demo.class.getClassLoader(),
new Class<?>[]{Demo.class},
proxy
);
System.out.println(demo.hello("你好"));
}
测试结果
开始之前
msg=你好
开始之后
hello