先分享记录些博主的文章:
《SSM框架》2Spring详解-KuangStudy-文章
java动态代理Proxy.newProxyInstance_徐海兴的专栏-CSDN博客_proxy.newproxyinstance
Java中InvocationHandler接口中第一个参数proxy详解_明洋的专栏-CSDN博客_invocationhandler接口
Proxy.newProxyInstance - 简书
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance - 我不吃番茄 - 博客园
第一座大山:InvocationHandler
全称java.lang.reflect.InvocationHandler,就是个接口(interface),包含invoke()方法
——public Object invoke(Object proxy, Method method, Object[] args)
第二座大山:Proxy.newProxyInstance()
public static Object newProxyInstance(ClassLoader loader,
Class>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
java.lang.reflect.Proxy.newProxyInstance()函数的作用是:返回某个对象的代理对象
newProxyInstance()方法有三个参数:
* ClassLoader loader:Java类加载器; 可以通过这个类型的加载器,在程序运行时,将生成的代理类加载到JVM即Java虚拟机中,以便运行时需要! * Class>[] interfaces:被代理类的所有接口信息; 便于生成的代理类可以具有代理类接口中的所有方法 * InvocationHandler h:调用处理器; 调用实现了InvocationHandler 类的一个回调方法
注意这里的第三个参数InvocationHandler h 就是前面说的第一座大山:InvocationHandler
第三座大山:invoke()
我刚开始踩了一个几乎是必踩的雷,把InvocationHandler的invoke()和method.invoke()搞混了,没办法,因为InvocationHandler的invoke()实现中一定会调用method.invoke()。实际上,虽然都叫invoke(),但是这两个invoke()是两个不同的方法。
因为我搞不清楚Object invoke(Object proxy, Method method, Object[] args) throws Throwable中的第一个参数proxy是干嘛用的,我就搜到第三篇参考文章,看完才明白,我想偏了:
原来proxy是jdk环境给我们的参数,我们想用就用,不想用可以扔一边不管。开始以为是要传递到jdk环境中的参数,还纳闷是谁把proxy传进去的,为什么没看到传参的过程。
现象想想,是因为把InvocationHandler的invoke()和method.invoke()搞混了,所以没有搞清是proxy参数是要传给invoke()的,还是invoke()代来的。
开始我一直以为参数proxy需要我(或者jdk系统环境)传给invoke()函数,invoke()带入到jdk中给后台环境使用,其实这恰恰是method.invoke()的操作流程。
知道此invoke()非method.invoke()后,一切就迎刃而解了。



