JDK动态代理:基于jdk的动态代理是基于接口实现的,如果被代理对象没有实现接口则不能完成代理。
1.1 定义一个外卖接口:
public interface TakeoutService {
public void sendtoaddress(String address);
}
1.2 外卖员实现:
public class ClerkService implements TakeoutService {
@Override
public void sendtoaddress(String address) {
System.out.println("your food has arrived."+address);
}
}
1.3 定义控制器即InvocationHandler:
public class MyInvocationHandler implements InvocationHandler {
Object object;
public MyInvocationHandler(Object object) {
this.object = object;
}
//proxy 代理对象
//method 代理对象调用的方法
//args 调用的方法中的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//反射获取信息
Object object = method.invoke(this.object,args);
return object;
}
}
1.4 测试类:
public class Main {
public static void main(String[] args) {
TakeoutService clerkService = new ClerkService();
TakeoutService proxyclerkService = (TakeoutService) Proxy.newProxyInstance(
clerkService.getClass().getClassLoader(),
clerkService.getClass().getInterfaces(),
new MyInvocationHandler(clerkService));
proxyclerkService.sendtoaddress("home");
}
}
1.5 执行情况
Proxy.newProxyInstance 生成代理对象,在调用代理对象的方法时,实际上是执行MyInvocationHandler里面的invoke方法。需要注意的是,InvocationHandler不是代理对象,只是一个辅助类。真正的代理对象是Proxy.newProxyInstance动态生成的。
每个代理的实例都有一个与之关联的 InvocationHandler 实现类,如果代理的方法被调用,那么代理便会通知和转发给内部的 InvocationHandler 实现类的invoke方法,由它决定处理。
源码分析:JDK动态代理最重要的接口为Proxy.newProxyInstance
public static Object newProxyInstance(ClassLoader loader, //类加载器
Class<?>[] interfaces, //代理的接口
InvocationHandler h) //控制器,代理对象实现被代理对象方法
参考:
【1】https://blog.youkuaiyun.com/J080624/article/details/81945043