JDK的动态代理
目的:在不修改源码的基础上,对已有方法增强
代理的方式
JDK的动态代理是基于接口的动态代理:
要求:被代理对象最少实现一个接口。
提供者:JDK官方
涉及的类:Proxy
涉及的方法: newProxyInstance():用于创建代理对象
方法的参数:
ClassLoader:类加载器,和被代理对象使用相同的类加载器。一般都是固定写法。
Class[]:实现的接口。和被代理对象实现相同的接口。一般固定写法
InvocationHandler: 如何代理。(想怎么增强方法,都写在这。)
它是一个接口,我们需要提供该接口的匿名内部类
JDK动态代理案例
被代理类Actor
要求必须实现一个接口
public class Actor implements IActor {
@Override
public void movie(String name) {
System.out.println("战狼三");
}
@Override
public void teleplay(String name) {
System.out.println("权利的游戏");
}
}
被代理类实现的接口IActor
public interface IActor {
void movie(String name);
void teleplay(String name);
}
使用JDK的动态代理对Actor类中方法增强
public class Demo {
@Test
public void demo(){
// 1 被代理对象
final IActor actor = new Actor();
// 2 创建代理对象 使用方法Proxy.newProxyInstance(被代理类的类加载器,被代理类的类实现的接 口,InvocationHandler匿名实现类实现方法增强)
IActor actorProxy = (IActor) Proxy.newProxyInstance(actor.getClass().getClassLoader(), actor.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 3 invoke(代理类,被增强方法,被增强方法的参数)
Object invoke = null;
if (method.getName().equals("teleplay")) {
// 4 增强方法1
System.out.println("插播广告:"+args[0]+",就是这么自信");
// 5 执行被增强方法method.invoke(被代理类, 方法参数);
invoke = method.invoke(actor, args);
}
if (method.getName().equals("movie")) {
System.out.println("插播广告:"+args[0]+",好酒");
invoke = method.invoke(actor, args);
}
return invoke;
}
});
// 6代理饿类执行方法
actorProxy.movie("茅台");
actorProxy.teleplay("飘柔");
}
}