动态代理
概述
适用场景——编译时无法确定需要实现哪个接口时才有必要使用
使用原理
1.在程序处于运行状态时,动态创建一个新类(实现被增强类实现的所有接口),并获得该类的对象(即动态对象)
2.无论何时调用代理对象的方法,调用代理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。
使用原因
路由对远程服务器的方法调用
在程序运行期间,将用户接口事件与动作进行关联
为调试,跟踪方法调用
代理的企业应用
Spring的AOP底层使用的就是代理机制(AOP面向切面编程)
Proxy对象
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
ClassLoader loader——类加载器
作为Java安全模型的一部分,对于系统类和从因特网下载的类,可以使用不同的类加载器
Class类
ClassLoader getClassLoader()
返回该类的类加载器。
Class<?>[] interfaces——被增强类的所有接口
Class类
Class<?>[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
InvocationHandler h——处理类
InvocationHandler接口
Object invoke(Object proxy, Method method, Object[] args)
在代理实例上处理方法调用并返回结果。
Method类
Object invoke(Object obj, Object... args)
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
类加载器
作用——将.class文件加载到JVM中,得到字节码文件
分类
引导类加载器
JDK(JAVA_HOME/jre/lib/rt.jar)
JVM的一部分(JVM是用C语言编写的)
扩展类加载器
JDK(JAVA_HOME/jre/lib/exe/*.jar)
应用类加载器
类路径下的所有class(自定义)
保证类只被加载一次不被重复加载
类加载器的全盘委托机制 |