欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

為什么java動態代理中,最終都轉換為調用invok方法?

林子帆2年前18瀏覽0評論

謝謝邀請,是的,最終都會調用invoke方法的,我用下面的例子來分析舉例:

基本介紹

  • 代理對象,不需要實現接口,但是目標對象要實現接口,否則不能用動態代理。
  • 代理對象的生成,是利用JDK的API,動態的內存中構建代理對象
  • 動態代理也叫做:JDK代理、接口代理

JDK中生成代理對象的API

  • 代理類所在包:java.lang.reflect.Proxy
  • JDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數,完整寫法為:
    • staticObjectnewProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)

動態代理應用舉例

用動態代理實現事務:

UserService:

UserServiceImpl:

UserServiceInvocationHandler:

測試類:

結果為:

下面分析,為什么java動態代理中,最終都轉換為調用invok方法?

我們先查看上面生成的proxy對象,

下面我們看看生成的$proxy0代碼:

很清楚,動態代理類實現了UserService接口,繼承了Proxy類。

接口方法:

invoke方法傳入3個參數,這個invoke方法也就是4.1.2中我們提到的InvocationHandler接口的invoke方法,那理解3個參數的意義也就很簡單了。

參數1傳入的為this——即$Proxy0本身,所以是內存中的動態代理對象

參數2傳入的為m3——也就是proxy.test.UserService中名為saveUser的方法,即接口中的方法。

參數3傳入的為null——因為saveUser方法沒有參數,所以為空。

完整代碼如下