日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 注解原理

發(fā)布時(shí)間:2024/8/23 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 注解原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面來看看Java中注解是如何實(shí)現(xiàn)的

創(chuàng)建注解類Inter:

?

創(chuàng)建測(cè)試類Test:

?

在程序第二句設(shè)置斷點(diǎn),可以看到:

?

可以看到,注解的實(shí)例是一個(gè)動(dòng)態(tài)代理類的對(duì)象.

要想查看這個(gè)動(dòng)態(tài)代理類,可以在代碼中加

System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

添加系統(tǒng)代理,將其導(dǎo)出為class文件

?

可以看到如下兩個(gè)文件:

?

反編譯$Proxy1.class,如下:

?

可以看到,動(dòng)態(tài)代理類是我們定義的注解實(shí)現(xiàn)類,反編譯Inner.class,如下:

?

可以看到,注解接口繼承了java.lang.annotation.Annotation, 通過查看源碼,該類源碼如下:

?

可以看到, 該類下的方法都被$Proxy1動(dòng)態(tài)代理類實(shí)現(xiàn)了.

到此處,我們已經(jīng)知道Inner注解(接口)是一個(gè)繼承了Annotation接口的特殊接口,而我們通過反射獲取注解時(shí),返回的是Java運(yùn)行時(shí)生成的動(dòng)態(tài)代理對(duì)象$Proxy1,該類就是Inner注解(接口)的具體實(shí)現(xiàn)類。

那么, 代理類是如何處理方法的調(diào)用的呢?

我們知道, 動(dòng)態(tài)代理方法的調(diào)用最終會(huì)傳遞給綁定的InvocationHandler實(shí)例的invoke方法處理。我們可以看看$Proxy1的源碼

?

其中語句調(diào)用了父類的成員變量,其父類為Proxy, 查看該成員變量,如下:

?

可以看到, h對(duì)象類型就是InvocationHandler接口的某個(gè)實(shí)現(xiàn)類

我們?cè)赑roxy類的構(gòu)造方法處設(shè)置斷點(diǎn):

?

通過斷點(diǎn)可以查看h具體是哪個(gè)對(duì)象:

?

可以看到, 該動(dòng)態(tài)代理類為AnnotationInvocationHandler對(duì)象, 查看該類的invoke方法如下:

?

其中的memberValues變量是以方法名為key,以變量為value的, 如下:

?

那么,這個(gè)memberValues變量是從哪來的呢?

?

可以看到,其是在構(gòu)造函數(shù)中進(jìn)行設(shè)置的.

反編譯我們的Test類,看到:

?

所以中間有一個(gè)類,負(fù)責(zé)創(chuàng)建代理對(duì)象AnnotationInvocationHandler, 其將變量從常量池中取出并創(chuàng)建map, 進(jìn)而創(chuàng)建代理對(duì)象, 這個(gè)類就是 AnnotationParser, 在此不細(xì)說了, 感興趣的可以自行斷點(diǎn)調(diào)試查看.


總結(jié)

注解本質(zhì)是一個(gè)繼承了Annotation的特殊接口,其具體實(shí)現(xiàn)類是Java運(yùn)行時(shí)生成的動(dòng)態(tài)代理類。通過代理對(duì)象調(diào)用自定義注解(接口)的方法,會(huì)最終調(diào)用AnnotationInvocationHandler的invoke方法。該方法會(huì)從memberValues這個(gè)Map中索引出對(duì)應(yīng)的值。而memberValues的來源是Java常量池。

總結(jié)

以上是生活随笔為你收集整理的Java 注解原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。