目录
7. 讲一下你项目中 redis的分布式锁 与java自带的锁有啥区别
1. 代理相关 从静态代理到动态代理
对目标行为的一种增强 前增强 后增强
静态代理
接口 定义规则
实现了接口的具体类
代理类 代理类生成具体类对象
然后继承了代理类
重写方法
使用具体类对象调用方法 并且加上自己逻辑
我们只要使用代理类对象就能实现代理
动态代理分为 JDK 动态代理和 Cglib 动态代理
JDK 动态代理主要是利用了 Proxy 类里面的 newProxyInstance(不会读 说的新的代理单例) 方法获取代理单例
传入参数 类加载器 实现接口 代理对象自定义类
代理对象自定义类实现了一个叫调用处理的接口(InvocationHandler)
然后重写 invoke 方法
原理实际上是将方法传到了 InvocationHandler 的 invoke 方法里面去
之后重写逻辑即可
cglib 动态代理也是如同 jdk 动态代理一样 (这边没说) 首先用工厂模式创建一个 Factory
定义一个方法获取代理对象 传入 Object
然后创建增强对象
传入类加载器
代理类
拦截器
拦截器同样是实现接口 我们在里面重写方法(这边说累了 就没说 )
最后总结
JDK 动态代理使用较多 但是限制是只能代理接口类
最后又想了想 静态代理是编译的时候就进入机器的 可拓展性很差
动态代理允许在运行的时候动态编译... (忘了)
(答 太多 就虚了 疯狂遗忘+口误)
2. cglib可以代理被final修饰的类吗,为什么
cglib动态代理是原理靠继承实现的
相当于让父类继承子类 然后优先调用子类的方法
面试官说我答的很含糊 问我有没有看过源码
我讲了一下cglib 动态代理的流程
工厂模式创建一个 factory 对象 然后创建一个动态代理增强类 Enhancer 对象
通过增强类的 set 方法传入参数
第一个参数 利用反射得到的类加载器
第二个参数 被代理类
第三个参数 方法拦截器 使用的一个命名为回调方法的东西
最后返回这个 代理类对象的 create() 方法
其中这个方法拦截器 实现了 MethodInterceptor 接口
重写了 intercept 方法
添加了自己的操作 与 jdk 动态代理的 invoke 方法相似
面试官又问我如何体现继承的
我说我看过源码 方法拦截器是传到一个数组里面去了 我看不懂源码 (汗流浃背)
3. JVM 体系结构
只记得类加载器
讲了一会 巴拉巴拉 八股吟唱 啦啦啦
加载 连接 初始化 使用 卸载
连接又分为验证 准备 解析
还卡了好几下
让我别讲了