精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

項目終于用上了插入式注解,真香!

開發(fā) 項目管理
我們?yōu)楣咎峁┝艘惶淄ㄓ玫腏AVA基礎(chǔ)組件包,組件包內(nèi)有不同的模塊,比如熔斷模塊、負載均模塊、rpc模塊等等,這些模塊均會被打成jar包,然后發(fā)布到公司的內(nèi)部代碼倉庫中,供其他人引入使用。

插入式注解處理器在《深入理解Java虛擬機》一書中有一些介紹(前端編譯篇有提到),但一直沒有機會使用,直到碰到這個需求,覺得再合適不過了,就簡單用了一下,這里做個記錄。

了解過lombok底層原理的都知道其使用的就是的插入式注解,那么今天筆者就以真實場景演示一下插入式注解的使用。

需求

我們?yōu)楣咎峁┝艘惶淄ㄓ玫腏AVA基礎(chǔ)組件包,組件包內(nèi)有不同的模塊,比如熔斷模塊、負載均模塊、rpc模塊等等,這些模塊均會被打成jar包,然后發(fā)布到公司的內(nèi)部代碼倉庫中,供其他人引入使用。

這份代碼會不斷的迭代,我們希望可以通過??promethus??來監(jiān)控現(xiàn)在公司內(nèi)使用各版本代碼庫的比例,希望達到的效果圖如下:

圖片

我們希望看到每一個版本的使用率,這有利于我們做版本兼容,必要的時候可以對古早版本使用者溯源。

問題

需求似乎很簡單,但真要獲取自身的jar版本號還是挺麻煩的,有個比較簡單但陰間的辦法,就是給每一個組件都加上當前的jar版本號,寫到配置文件里或者直接設(shè)置成常量,這樣上報promethus時就可以直接獲取到j(luò)ar包版本號了,這個方法雖然可以解決問題,但每次迭代版本都要跟著改一遍所有組件包的版本號數(shù)據(jù),過于麻煩。

有沒有更好的解決辦法呢?比如我們可不可以在gradle打包構(gòu)建時拿到j(luò)ar包的版本號,然后注入到每個組件中去呢?就像lombok那樣,不需要寫get、set方法,只需要加個注解標記就可以自動注入get、set方法。

比如我們可以給每個組件定義一個空常量,加上自定義的注解:

@TrisceliVersion
public static final String version = "";

然后像lombok生成set/get方法那樣注入真正的版本號:

@TrisceliVersion
public static final String version = "1.0.31-SNAPSHOT";

參考lombok的實現(xiàn),這其實是可以做到的,下面來看解決方案。

解決

java中解析一個注解的方式主要有兩種:編譯期掃描、運行期反射,這是lombok ??@Setter??的實現(xiàn):

@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Setter {
// 略...
}

可以看到??@Setter???的??Retention???是??SOURCE???類型的,也就是說這個注解只在編譯期有效,它甚至不會被編入class文件,所以lombok無疑是第一種解析方式,那用什么方式可以在編譯期就讓注解被解析到并執(zhí)行我們的解析代碼呢?答案就是定義插入式注解處理器(通過JSR-269提案定義的??Pluggable Annotation Processing API??實現(xiàn))

插入式注解處理器的觸發(fā)點如下圖所示:

圖片

也就是說插入式注解處理器可以幫助我們在編譯期修改抽象語法樹(AST)!所以現(xiàn)在我們只需要自定義一個這樣的處理器,然后其內(nèi)部拿到j(luò)ar版本信息(因為是編譯期,可以找到源碼的path,源碼里隨便搞個文件存放版本號,然后用java io讀取進來即可),再將注解對應(yīng)語法樹上的常量值設(shè)置成jar包版本號,語法樹變了,最終生成的字節(jié)碼也會跟著變,這樣就實現(xiàn)了我們想在編譯期給常量version注入值的愿望。

自定義一個插入式注解處理器也很簡單,首先要將自己的注解定義出來:

@Documented
@Retention(RetentionPolicy.SOURCE) //只在編譯期有效,最終不會打進class文件中
@Target({ElementType.FIELD}) //僅允許作用于類屬性之上
public @interface TrisceliVersion {
}

然后定義一個繼承了AbstractProcessor的處理器:

/**
* {@link AbstractProcessor} 就屬于 Pluggable Annotation Processing API
*/
public class TrisceliVersionProcessor extends AbstractProcessor {

private JavacTrees javacTrees;
private TreeMaker treeMaker;
private ProcessingEnvironment processingEnv;

/**
* 初始化處理器
*
* @param processingEnv 提供了一系列的實用工具
*/
@SneakyThrows
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.processingEnv = processingEnv;
this.javacTrees = JavacTrees.instance(processingEnv);
Context context = ((JavacProcessingEnvironment) processingEnv).getContext();
this.treeMaker = TreeMaker.instance(context);
}


@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latest();
}

@Override
public Set<String> getSupportedAnnotationTypes() {
HashSet<String> set = new HashSet<>();
set.add(TrisceliVersion.class.getName()); // 支持解析的注解
return set;
}

@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (TypeElement t : annotations) {
for (Element e : roundEnv.getElementsAnnotatedWith(t)) { // 獲取到給定注解的element(element可以是一個類、方法、包等)
// JCVariableDecl為字段/變量定義語法樹節(jié)點
JCTree.JCVariableDecl jcv = (JCTree.JCVariableDecl) javacTrees.getTree(e);
String varType = jcv.vartype.type.toString();
if (!"java.lang.String".equals(varType)) { // 限定變量類型必須是String類型,否則拋異常
printErrorMessage(e, "Type '" + varType + "'" + " is not support.");
}
jcv.init = treeMaker.Literal(getVersion()); // 給這個字段賦值,也就是getVersion的返回值
}
}
return true;
}

/**
* 利用processingEnv內(nèi)的Messager對象輸出一些日志
*
* @param e element
* @param m error message
*/
private void printErrorMessage(Element e, String m) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, m, e);
}

private String getVersion() {
/**
* 獲取version,這里省略掉復(fù)雜的代碼,直接返回固定值
*/
return "v1.0.1";
}

定義好的處理器需要??SPI機制???被發(fā)現(xiàn),所以需要定義??META.services??:

圖片

測試

新建測試模塊,引入剛才寫好的代碼包:

圖片

這是Test類:

圖片

現(xiàn)在我們只需要讓gradle build一下,新得到的字節(jié)碼中該字段就有值了:

圖片

這只是插入式注解處理器功能的冰山一角,既然它可以通過修改抽象語法樹來控制生成的字節(jié)碼,那么自然就有人能充分利用其特性來實現(xiàn)一些很酷的插件,比如lombok,我們再也不用寫諸如set/get這種模板式的代碼了,只要我們足夠有創(chuàng)意,就可以讓基于這一套API實現(xiàn)的插件在功能上有很大的發(fā)揮空間。

責任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2024-09-14 09:59:04

2022-12-19 08:32:57

項目Feign框架

2025-06-03 08:20:00

Feign微服務(wù)

2025-09-18 09:31:01

2025-02-18 14:08:14

2021-04-23 08:29:47

SkyWalking監(jiān)控系統(tǒng)

2025-07-28 09:36:45

2023-09-14 15:15:36

2021-05-27 15:43:29

鴻蒙安卓和iOS

2012-04-23 13:28:41

Voice AnsweSiriAppstore

2025-08-01 09:09:02

2020-02-21 08:00:00

網(wǎng)頁廣告診斷

2020-04-09 08:29:50

編程語言事件驅(qū)動

2024-02-21 11:33:25

Serilog.NET日志庫

2018-04-24 14:12:29

蘋果iPhone手機

2022-01-25 10:40:30

Windows 10微軟升級

2018-07-24 15:23:18

2020-07-23 10:51:29

NginxWebApache

2024-06-28 08:21:20

前端自動化部署
點贊
收藏

51CTO技術(shù)棧公眾號

日韩精品久久理论片| 日本在线中文字幕一区| 一区二区三区四区激情| av免费观看久久| 日本中文在线播放| 成人网18免费网站| 欧美不卡一区二区三区四区| 精品日韩欧美在线| 无码人妻精品一区二区蜜桃网站| 亚洲AV成人无码一二三区在线| 一区二区日韩免费看| 在线激情影院一区| av电影中文字幕| 香蕉成人av| 亚洲一区免费观看| 视频一区二区三| 好男人在线视频www| 日韩国产欧美在线播放| 欧美精品电影在线| 亚洲毛片亚洲毛片亚洲毛片| 国产精品美女在线观看直播| 欧美日本视频在线| 欧美性大战久久久久xxx| 麻豆电影在线播放| 99久久国产免费看| 成人精品网站在线观看| 欧美a视频在线观看| 午夜日韩福利| 色妞欧美日韩在线| 3d动漫精品啪啪一区二区下载| 国产视频一区二区在线播放| 在线精品亚洲一区二区不卡| 国产a级片网站| 国产美女在线观看| 中文字幕电影一区| 麻豆精品传媒视频| 乱色精品无码一区二区国产盗| 免费成人av在线| 欧洲亚洲女同hd| 国产亚洲精品码| 91国语精品自产拍| 深夜福利91大全| 永久免费av无码网站性色av| 欧美日韩另类图片| 精品国产一区二区三区久久久蜜月 | 777午夜精品福利在线观看| 欧美一级特黄高清视频| 精品国产一区二区三区小蝌蚪| 亚洲国产精品人久久电影| 97超碰人人看| 成人噜噜噜噜| 8x8x8国产精品| 国产一伦一伦一伦| 国产极品一区| 欧美久久久久久蜜桃| jizz欧美激情18| 日韩一区二区三区免费| 欧美日韩国产综合视频在线观看中文| 99久久久精品视频| 国产理论电影在线| 亚洲国产wwwccc36天堂| 给我免费播放片在线观看| 后进极品白嫩翘臀在线播放| 亚洲一区二区欧美| www..com日韩| 国产理论在线| 色综合天天综合网天天狠天天| 日韩欧美一区二| 亚洲天堂电影| 欧美性猛交xxxx乱大交退制版| 男人的天堂日韩| www.一区| 欧美一区二视频| 午夜性福利视频| 99国产精品免费网站| 亚洲国产精品va| 受虐m奴xxx在线观看| 精品一区二区三| 久久精品福利视频| 国产一区二区视频在线观看免费| 欧美jjzz| 97av视频在线| 国产无遮挡又黄又爽又色视频| 青青草原综合久久大伊人精品优势| 国产日韩换脸av一区在线观看| 国产女人爽到高潮a毛片| 国产成a人亚洲| 久久成人资源| 成年人在线观看视频| 亚洲女同女同女同女同女同69| 欧美黄网在线观看| 在线观看涩涩| 51午夜精品国产| 女同性恋一区二区三区| 欧美肉体xxxx裸体137大胆| 久久久97精品| 日韩在线视频免费播放| 麻豆91在线观看| 国产91免费视频| 女人天堂在线| 亚洲男同性恋视频| 97xxxxx| 国产精品1区在线| 亚洲激情视频在线| 91ts人妖另类精品系列| 亚洲激情视频| 成人午夜在线观看| 肉丝一区二区| 亚洲欧美日韩国产一区二区三区| 久久精品视频16| av成人在线网站| 亚洲精品一区二三区不卡| 51精品免费网站| 国产亚洲午夜| 亚洲最大成人网色| 黄色电影免费在线看| 一区二区三区精品视频| www.色偷偷.com| 红杏视频成人| 久久久久999| 免费视频网站在线观看入口| 床上的激情91.| 在线观看免费91| 亚洲欧洲日本韩国| 精品免费99久久| 97在线观看免费高| 日韩福利电影在线观看| 精品一区久久| av在线视屏| 日韩一区二区三区在线| 欧美美女性生活视频| 久久国产精品毛片| 国产一级精品aaaaa看| 成a人片在线观看| 欧美色综合久久| 欧美黑人欧美精品刺激| 在线欧美一区| 99影视tv| 日本三级韩国三级欧美三级| 欧美精品一级二级| 女教师淫辱の教室蜜臀av软件| 国产精品一卡| 精品视频导航| mm视频在线视频| 精品日韩欧美一区二区| 欧美人妻一区二区| 国产精品中文有码| 青少年xxxxx性开放hg| 久久日本片精品aaaaa国产| 亚洲图片欧洲图片av| 免费av网站在线| 久久在线观看免费| 精品国产免费av| 网友自拍一区| 欧美在线性爱视频| 免费观看成年在线视频网站| 色av成人天堂桃色av| japanese中文字幕| 日韩主播视频在线| 亚洲 日韩 国产第一区| 啪啪av大全导航福利综合导航| 尤物精品国产第一福利三区| 欧美一区免费看| 国产农村妇女毛片精品久久麻豆 | 国产成人免费视频一区| 成人在线免费观看网址| 久久视频免费| 久久久久久久国产精品| 香蕉视频免费在线看| 日韩欧美在线免费| 永久免费毛片在线观看| 美女看a上一区| 国产盗摄视频在线观看| 中文无码日韩欧| 午夜精品理论片| 免费在线视频你懂得| 精品视频在线视频| 国产人妻精品一区二区三区不卡| 国产精品18久久久久久久网站| 日本人妻伦在线中文字幕| 日韩有码av| 国产精品无av码在线观看| 黄色成人在线| 亚洲成人免费在线视频| 亚洲久久在线观看| 国产精品国产三级国产普通话蜜臀| 91热视频在线观看| 亚洲人成免费| 西游记1978| 一区二区三区在线免费看| 欧美一级片一区| 日本视频在线| 欧美大片在线观看一区| 超碰超碰超碰超碰| 亚洲色图在线看| 中文字幕a在线观看| 轻轻草成人在线| 男人插女人视频在线观看| av伊人久久| www 成人av com| 国产一区二区三区朝在线观看| 理论片在线不卡免费观看| 天堂а√在线8种子蜜桃视频| 欧美午夜精品一区二区蜜桃| 欧美久久久久久久久久久久| 91老司机福利 在线| 伊人色在线视频| 亚洲欧美日本视频在线观看| 在线成人av电影| 天海翼亚洲一区二区三区| 成人免费在线视频网址| 一根才成人网| 色综合久久久久久中文网| 三级做a全过程在线观看| 日韩欧美卡一卡二| 中国黄色一级视频| 欧美日韩国产丝袜美女| 国产探花在线免费观看| 欧美国产精品久久| 在线观看国产网站| 国产激情偷乱视频一区二区三区| 麻豆av免费在线| 亚洲欧洲午夜| 乱子伦一区二区| 日本久久一二三四| 九九久久99| 96sao在线精品免费视频| 国产色综合天天综合网| 经典三级一区二区| 2019中文字幕在线观看| 91吃瓜在线观看| 九九精品在线视频| 国产秀色在线www免费观看| 一区二区三区 在线观看视| 四虎影视2018在线播放alocalhost| 欧美成人免费网站| 99国产在线播放| 欧美乱妇20p| www.久久网| 色先锋久久av资源部| 69视频免费在线观看| 午夜激情综合网| 黄色小视频在线免费看| 夜夜嗨av一区二区三区网页| 亚洲欧洲综合网| 国产精品久久久久久久久免费桃花| 无码h肉动漫在线观看| 99re热这里只有精品免费视频| 亚洲熟妇一区二区| 国产丶欧美丶日本不卡视频| 午夜大片在线观看| 国产美女久久久久| www.久久com| 国产乱码精品一区二区三区av| 欧美激情第3页| 国产最新精品精品你懂的| 国产三级精品三级在线| 韩国成人福利片在线播放| 久国产精品视频| 国产一区二区精品久久| 中文字幕无码毛片免费看| 国产成人av一区二区| 日本道中文字幕| 26uuu国产电影一区二区| 97超碰在线资源| 国产三级久久久| 欧美成人短视频| 亚洲欧美在线高清| 免费在线观看亚洲| 成码无人av片在线观看网站| 亚洲午夜性刺激影院| 色三级在线观看| 久久综合五月天| 波多野结衣在线高清| 4p变态网欧美系列| 欧美影视资讯| 亚洲伊人成综合成人网| 国产福利一区二区精品秒拍| 麻豆传媒一区| 四虎成人精品永久免费av九九| 干日本少妇视频| 亚洲一区欧美激情| 日韩一区二区三区久久| 国产激情视频一区二区在线观看 | 日韩免费一级| 久久综合色一本| 国产精品精品| 日韩av中文字幕第一页| 美女爽到呻吟久久久久| 日韩高清第一页| caoporm超碰国产精品| 成人国产精品久久久网站| 亚洲精品欧美二区三区中文字幕| 欧美日韩精品在线观看视频| 日韩欧美国产激情| 国产色视频在线| 亚洲剧情一区二区| 操你啦视频在线| 青青在线视频一区二区三区| gogo大尺度成人免费视频| 九九九九久久久久| 91tv官网精品成人亚洲| 欧美日韩国产精品激情在线播放| 久久精品国产久精国产| 久久久久久久无码| 亚洲欧洲av一区二区三区久久| 日本一级片免费看| 91精品福利在线一区二区三区 | 日本欧美黄色片| 国产在线精品不卡| 亚洲第一香蕉网| 亚瑟在线精品视频| 国产精品视频第一页| 亚洲三级av在线| 国精一区二区三区| 91精品啪在线观看麻豆免费| 天堂综合网久久| www.亚洲视频.com| 精东粉嫩av免费一区二区三区| 黄色短视频在线观看| 亚洲男女毛片无遮挡| 亚洲视屏在线观看| 日韩精品视频在线观看网址| 色呦呦在线看| 成人啪啪免费看| 欧美日韩一二三四| 国产极品美女高潮无套久久久| thepron国产精品| 欧美成人精品欧美一级私黄| 精品视频一区 二区 三区| 免费在线国产| 91高潮在线观看| youjizzjizz亚洲| 9色视频在线观看| 国内欧美视频一区二区| 永久免费毛片在线观看| 色哟哟日韩精品| 日韩一区av| 欧美亚洲在线视频| 精品中国亚洲| 国产综合中文字幕| av成人老司机| 福利一区二区三区四区| 精品av久久707| free性欧美| 国产精品亚洲综合| 在线日韩电影| 无码一区二区精品| 天天色天天操综合| 欧美xxx.com| 国产精品第100页| 成人免费av| 亚洲一区二区三区四区精品| 亚洲视频1区2区| 亚洲风情第一页| 992tv在线成人免费观看| 女仆av观看一区| 国产欧美高清在线| 国产精品理伦片| 国产成人精品a视频| 欧美福利视频在线| 国产一区在线电影| 国产原创中文在线观看| 久久精品夜夜夜夜久久| 在线视频 中文字幕| 超碰91人人草人人干| 91精品尤物| 日韩在线综合网| 国产欧美日韩在线看| 91福利在线观看视频| 久久成人18免费网站| 国产精品超碰| 久久久国产欧美| 亚洲日本乱码在线观看| 亚洲精品福利网站| 欧美影院久久久| 色综合天天爱| 国产女主播在线播放| 欧美日韩亚洲视频一区| av大片在线观看| 97超级碰碰| 蜜桃伊人久久| 国产黄色小视频网站| 亚洲黄页视频免费观看| 久久精品国产福利| 青青在线免费观看| 久久精品视频一区二区三区| 中文字幕在线观看国产| 欧美大学生性色视频| 蜜桃一区二区三区| 亚洲第一色av| 亚洲成在人线免费| 1区2区3区在线观看| 成人资源视频网站免费| 丝袜美腿亚洲一区二区图片| 希岛爱理中文字幕| 亚洲精品永久免费| 精品中文在线| 超碰影院在线观看| 一区二区三区精密机械公司|