JDK动态代理简介
什么是JDK动态代理?
先看看代理的概念——代理:为其他对象提供一种代理以控制对这个对象的访问。
代理在生活中很常见,比如买火车票可以不去火车站,而是通过代售点;想要逃课了,就让同学代签到等等。
说白了,就是可以通过代理来完成目标事件。(自我理解)
不同于静态代理直接采用编码的方式实现,JDK动态代理是利用反射机制在运行时创建代理类,进而调用相应的方法。
JDK动态代理的使用
通过一个小例子来看看如何使用JDK动态代理。
目标接口
public interface GameService {
String beginGame(String s);
void playGame(String s);
}
目标接口中定义了两个目标方法。
目标对象
public class GamePlay implements GameService {
public String beginGame(String name) {
System.out.println("玩家" + name + "进入召唤师峡谷,游戏开始!");
return "玩家名字是:" + name;
}
public void playGame(String s) {
System.out.println("玩家说: " + s);
}
}
目标对象是目标接口的实现,也是要被代理的对象。
调用处理器——InvocationHandler
public class GameInvocationHandler implements InvocationHandler {
private Object target;
//构造方法(可传入目标对象)
public GameInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//业务逻辑
System.out.println("before-----欢迎来到——动态召唤师峡谷");
//方法的返回值(可以为空)
Object object = method.invoke(target, args);
//业务逻辑
System.out.println("after------欢迎离开——动态召唤师峡谷");
return object;
}
}
InvocationHandler是调用处理器接口,它只定义了唯一一个 invoke() 方法,通过重写该方法可自定义代理的业务逻辑,该方法三个参数:
- proxy:代理类对象($Proxy0),在该方法中一般不会用到
- method:被代理类调用的方法对象
- args:方法对象中的参数
创建代理类对象——Proxy.newProxyInstance()
public class GamePlayDynamicProxy {
public static void main(String[] args) {