从语言类型信息是在运行时检查,还是在编译期检查,可以将语言分为动态语言和静态语言,语言也可以分为强类型语言与弱类型语言,强
类型语言与弱类型语言区分在于不同类型的变量赋值时是否需要进行显式(强制)的类型转换。
通常认为JAVA语言是静态的强类型语言。Java 是静态的强类型语言,但是因为提供了类似反射等机制,也具备了部分动态类型语言的能力
反射机制是JAVA语言提供的一种基础功能,赋予程序在运行时自省的能力,通过反射,我们可以直接操作类或者对象,必须获取类的定义,获取类声明的属性与方法,调用方法或者构造对象,甚至可以在运行时修改类的定义。
动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。
实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。
动态代理的区别:
1、JDK动态代理
JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
此方法的参数含义如下
proxy:代表动态代理对象
method:代表正在执行的方法
args:代表当前执行方法传入的实参
返回值:表示当前执行方法的返回值
JDK动态代理的优点:
- 最小化依赖关系,减少依赖意味着简化开发和维护,JDK 本身的支持,可能比 cglib 更加可靠。
- 平滑进行 JDK 版本升级,而字节码类库通常需要进行更新以保证在新版 Java 上能够使用。
- 代码实现简单。
2、基于类似 cglib 框架的代理
CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
基于类似 cglib 框架的代理优点:
- 有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似 cglib 动态代理就没有这种限制。
- 只操作我们关心的类,而不必为其他相关类增加工作量。
- 高性能。