JDK动态代理属于Java反射机制里颇为实用的特性当中的一个, 它能够让我们在不去改动目标类代码的情形下, 于运行的时候动态地生成代理对象, 进而达成对方法调用的拦截以及增强。去领会它的实现原理, 针对掌握AOP框架、明白Spring等主流框架的设计思路来讲是极为关键的。代理对象是怎么创建出来的于JDK动态代理而言, 其核心之处在于java.lang.reflect.Proxy类以及InvocationHandler接口。当我们去调用Proxy.newProxyInstance()方法之际, JVM会于内存里动态生成一个代理类的字节码, 随后借助类加载器加载这个全新的类, 最终将代理对象实例化出来。如此代理类达成了咱们所指定的全部接口, 且朝着InvocationHandler的invoke方法去转发所有方法调用。详细来讲呢, newProxyInstance方法所需要的是三个参数, 分别乃是类加载器, 那要代理的接口数组以及InvocationHandler实例。类加载器它运用来加载动态生成的代理类呢, 接口数组起到决定代理对象能够响应哪些方法调用的作用而InvocationHandler它负责实际去处理这些调用。代理类的内部, 会针对每个接口方法, 去生成与之对应的Method对象, 并且, 在方法被调用这个情况发生的时候, 会把方法对象以及参数, 传递给InvocationHandler.invoke()。此过程关联诸多底层操作, JVM于进行代理类字节码生成之际, 会依循固定模板搭建类之结构, 涵盖继承Proxy类, 实现特指定的接口, 产出构造函数, 以及针对每个接口方法创制相应的转发方法, 所生成的字节码最终以byte[]形态留存于内存里, 并非写入磁盘文件。InvocationHandler如何控制方法调用InvocationHandler属于一个函数式接口, 只设定了一个invoke方法。一旦代理对象上的任意方法被调用, 便会进入这个invoke方法当中。我们能够于此处达成日志记录、权限校验、事务管理等横切逻辑, 随后判定是否去调用目标对象的真实方法。以下是一种典型场景: 在invoke办法之中, 首先执行前置增强方面的逻辑, 接着借助method.invoke(target, args)去调用目标对象的实际方法, 最后执行后置增强方面的逻辑。这里面的target是实实在在的业务对象, 它需要在创建InvocationHandler之际被传入。要是不打算去调用实际的方法, 那么也能够直接返回一个默认的值, 借此达成方法拦截的目的。