代理
为对象提供一个代理类,通过代理类调用对象的方法动态代理
运行时生成代理。
动态代理的实现
自定义一个业务接口
1 | public interface IRepository { |
实现InvocationHandler接口,并可以在method方法封装自己的业务逻辑。
1 | public class RepositoryInvocationHandler implements InvocationHandler { |
1 | // 生成RepositoryInvocationHandler实例 |
动态代理的原理
顺着流程看看动态代理的生成逻辑。
动态代理通过Proxy.newProxyInstance生成代理类。
1 | public static Object newProxyInstance(ClassLoader loader, // 接口类的ClassLoade |
查询或生成代理类。
1 | private static Class<?> getProxyClass0(ClassLoader loader, Class<?>... interfaces) { |
WeakCache里面持有一个ProxyClassFactory引用,通过proxyClassCache.get方法获取代理类,调用了ProxyClassFactory.apply方法。
具体看看ProxyClassFactory.apply方法。
1 |
|
先解析业务接口的方法,然后通过native方式生成代理类。
看一下具体的$Proxy0代理类:(代理类生成在内存)
1 | public final class $Proxy0 extends Proxy implements IRepository { |
整个流程如下:
- 业务接口IRepository和实现业务代理操作类RepositoryInvocationHandler传入Proxy的newProxyInstance;
- 通过Proxy生成具体动态代理类$Proxy0;
- 执行proxy.request()时,其实调用的是$Proxy0的request方法,最终调用的是RepositoryInvocationHandler;
- RepositoryInvocationHandler里是我们自己的实现,method.invoke(repository, args)反射调用了IRepository具体业务逻辑。
Done.
参考文章:
Java动态代理实现及原理分析