JDK动态代理原理简介

我的博客地址:http://www.ypbck.xyz  http://118.24.14.224

JDK的动态代理可能初学者接触不到,但是我想说,真的很有用,spring不就要依靠动态代理吗,下面讲讲原理

核心类:Porxy(生成代理对象),InvoationHandler
核心方法:Proxy . newProxyInstance(ClassLoader,Class,InvocationHandler)
InvoationHandler . Invoke(Object,Method,Object[])

代理原则:被代理类必须实现一个或多个接口,换句话说,动态代理是为接口生成一个实现类,此类扩展了需要被代理的类的功能。

代理生成过程:
调用 Proxy . newProxyInstance 方法将返回一个代理对象,调用此方法将传入被代理类的ClassLoder,Class,InvocationHandler对象(它的invoke方法实现要代理的功能),此方法会先拿到被代理对象实现的接口,被代理对象的方法集合,然后为该接口生成一个实现类(直接在内存中生成这个代理类的字节码),实现类的每一个方法都调用InvocationHandler的invoke方法,以this,被代理对象的该方法,它的参数作为参数去调用。于是当调用代理类的某方法时都变成了调用InvocationHandler的invoke方法。

答疑:
(1) Proxy . newProxyInstance调用将返回一个Object对象(生成的代理对象),当强制转换成被代理类对象时会发生:ClassCastException 异常。这是由于动态代理实际上是为被代理对象实现的接口重新写了一个实现类,实现的是接口而非继承被代理类,所以两者类型不匹配。只能转换成接口的实现对象,由于两个类都实现了相同的接口,所以代理对象的每一个方法中都会去获取被代理对象的同名方法,并且作为参数调用InvocationHanler的invoke方法,所以在执行代理对象的任何方法时,都会调用InvocationHandler的invoke方法,而在invoke中用target(InvocationHandler中需传入的被代理对象)对象区调用即可执行到被代理对象的目标方法。

体会:动态代理相当于新写了一个被代理接口的实现类,该类包装了被代理类,扩展了其功能,并且这些细节是对用户不可见的。

你可能感兴趣的:(java,JDK,动态代理,java)