精品欧美一区二区三区在线观看 _久久久久国色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一区二区凹凸精品| 欧美一区二区精美| 日日摸日日碰夜夜爽无码| 精品伦精品一区二区三区视频| 人妻少妇偷人精品久久久任期| sis001亚洲原创区| 国产拍揄自揄精品视频麻豆| 亚洲a级在线观看| 国产一级片毛片| 亚洲va在线| 亚洲欧洲一区二区三区在线观看 | 精品人妻一区二区三区香蕉 | 精品视频在线视频| 一卡二卡三卡视频| 青青青青在线| 久久久久九九视频| 国产精品我不卡| 91在线你懂的| 日韩在线一区二区| 亚州国产精品久久久| av最新在线观看| 亚洲女娇小黑人粗硬| 日韩免费视频一区| 国产aⅴ爽av久久久久| 在线精品亚洲欧美日韩国产| 亚洲精品伦理在线| 亚洲图片欧洲图片日韩av| 婷婷在线观看视频| 国产成人免费在线观看| 国产精品自产拍高潮在线观看| 五月婷婷开心网| 欧美午夜一区| 国产成人三级| 欧美乱妇一区二区三区不卡视频| 无码专区aaaaaa免费视频| 在线免费av导航| 中文字幕一区二区视频| 日本视频一区二区在线观看| 少妇一级淫片免费看| 国产成人精品三级| 91精品久久久久久久久久久久久| 日本视频免费观看| 亚洲欧美日本国产专区一区| 久久久久久久一区二区三区| 黄色在线观看免费| 午夜日韩av| 欧美床上激情在线观看| 午夜精品福利在线视频| 五月婷婷六月综合| 久久久成人精品视频| 91香蕉视频污在线观看| 成人羞羞网站| 视频在线一区二区| 午夜精品久久久久99蜜桃最新版 | 亚洲精品中字| jizzjizz在线观看| 中文字幕精品一区 | 国精品一区二区三区| 欧美成人黄色小视频| 日本天堂中文字幕| 国产一区激情| 欧美亚洲国产视频小说| 影音先锋在线国产| 石原莉奈一区二区三区在线观看| 国产精品com| 夜夜爽8888| 国产在线视频不卡二| 91成人理论电影| 成人免费视频国产| 91丨porny丨蝌蚪视频| 美女黄毛**国产精品啪啪| 欧美69xxxxx| 国产精品天干天干在线综合| 亚洲一区3d动漫同人无遮挡| 韩国中文字幕在线| 亚洲一区二区av在线| 日韩视频在线视频| 影视一区二区三区| 欧美精品乱码久久久久久| 国产成人av免费观看| 麻豆成人入口| 中文一区二区视频| 国产探花在线免费观看| 亚洲三级网站| 国产精品入口免费视频一| 国产99999| 91农村精品一区二区在线| 日韩不卡av| 2024短剧网剧在线观看| 香蕉成人伊视频在线观看| 四虎永久在线精品无码视频| 亚洲一区二区三区久久久| 亚洲国产免费av| 久久久久亚洲AV成人无在| 欧美网站在线| 国产精品高清免费在线观看| 国产国语亲子伦亲子| 91日韩精品一区| 中文字幕av日韩精品| 人成在线免费网站| 欧美日韩一区二区三区视频| 日本一区二区三区四区视频| 久热在线视频观看| jazzjazz国产精品久久| 在线视频中文亚洲| 久久综合亚洲色hezyo国产| 日韩国产成人精品| 成人免费看片网址| 91社区在线观看| 亚洲高清在线视频| 污视频网址在线观看| 偷拍视屏一区| 欧美激情喷水视频| 一区二区三区午夜| 久久亚洲一区二区三区明星换脸| 国产树林野战在线播放| 成人做爰视频www网站小优视频| 日韩精品中文字幕在线不卡尤物 | 色婷婷色综合| 欧美资源在线观看| 丰满人妻熟女aⅴ一区| 国产精品美女一区二区| 一本大道熟女人妻中文字幕在线| 日本一区二区三区电影免费观看| 正在播放亚洲1区| 在线观看免费av片| jizz一区二区| 欧美无砖专区免费| 国产日韩一区二区三免费高清| 中文在线不卡视频| 免费在线不卡av| 久久亚区不卡日本| 成 年 人 黄 色 大 片大 全| 玖玖玖电影综合影院| www.久久久久| 中文字幕一区二区三区四区免费看| 久久综合九色综合97婷婷女人 | 久久精品日韩无码| 日本在线观看大片免费视频| 蜜臀av一级做a爰片久久| 精品视频第一区| 99热99re6国产在线播放| 日韩欧美一区二区视频| 日韩视频中文字幕在线观看| 国内精品自线一区二区三区视频| 亚洲欧美精品在线观看| 国产欧美在线观看免费| 亚洲网站视频福利| 天天天天天天天干| 中文字幕免费一区| 国产探花在线看| 久久在线免费| 91久久国产婷婷一区二区| 大片免费在线观看| 日韩区在线观看| 欧美黄色免费观看| 成人av在线资源| 亚洲熟妇无码另类久久久| 在线日本制服中文欧美| 国产精品91免费在线| yw视频在线观看| 欧美男生操女生| 欧美成人三级在线观看| 国产91精品入口| 日韩中文字幕在线视频观看| 亚洲三级网址| 国产人妖伪娘一区91| 一区二区三区伦理| 亚洲激情视频在线播放| 男人天堂av在线播放| 日本一区二区不卡视频| 亚洲一区二区福利视频| 欧美久久99| 久久久99爱| 成人精品动漫| 久久精品99无色码中文字幕 | 色中文字幕在线观看| 国产精品xnxxcom| 国产精品一二二区| 成人免费91在线看| 91精品论坛| 色诱女教师一区二区三区| av中文字幕免费在线观看| 亚洲大片精品永久免费| 人人妻人人澡人人爽 | jjzz黄色片| 久久不射中文字幕| 9999在线观看| 欧美巨大xxxx| 成人欧美一区二区三区黑人孕妇| 美女精品导航| 正在播放欧美一区| 欧美 日韩 综合| 欧美日韩一区二区三区四区| 亚洲精品午夜久久久久久久| 国产免费成人在线视频| 久久人妻少妇嫩草av蜜桃| 水蜜桃久久夜色精品一区的特点| 成人在线免费观看网址| 欧美日本成人| 97视频中文字幕| 97精品国产综合久久久动漫日韩 | 日韩精品一区二区在线视频| 国产99久久久国产精品成人免费 | 日本精品影院| 成人字幕网zmw| 高清电影一区| 国语自产精品视频在线看抢先版图片 | 粉嫩av一区二区三区粉嫩| 成人在线免费播放视频| 国内精品嫩模av私拍在线观看 | 亚洲无线一线二线三线区别av| 日本婷婷久久久久久久久一区二区| 美国十次综合久久| 国产精品久久久久不卡| 久久久男人天堂| 久久亚洲国产精品成人av秋霞| 免费观看精品视频| a免费在线观看| 怡红院精品视频| 五月婷婷六月丁香综合| 精品国产乱码久久久久久影片| 中文字幕在线播放不卡| 日韩人体视频一二区| 日韩伦理在线视频| 一区二区三区 在线观看视频| 久久久免费看片| 国产欧美一区二区精品性| 特级西西人体4444xxxx| 成人黄色在线视频| 中文字幕av一区二区三区人妻少妇| 美女视频网站黄色亚洲| 男人的天堂日韩| 欧美一级播放| 男人操女人免费软件| 在线综合亚洲| 日韩中文字幕在线视频观看| 99热这里只有精品8| 亚洲精品无码国产| 亚洲电影在线| 久久久性生活视频| 亚洲免费成人| 玩弄中年熟妇正在播放| 国产精品毛片| 日本熟妇人妻xxxxx| 欧美一区=区| 日韩中文字幕免费在线| 日韩av午夜在线观看| 狠狠热免费视频| 免费人成在线不卡| 91精产国品一二三产区别沈先生| 久久99精品久久久久久国产越南| 欧美大尺度做爰床戏| 久久99国产乱子伦精品免费| 亚洲综合20p| 国产丶欧美丶日本不卡视频| youjizz.com国产| 91在线播放网址| 国产精品毛片一区二区| 国产女人18毛片水真多成人如厕 | 久久久久久综合网| 国产成人免费在线| av网页在线观看| 久久综合久久综合亚洲| 国产又粗又长免费视频| 亚洲欧洲韩国日本视频| 五月婷婷一区二区| 精品欧美aⅴ在线网站| 无码人妻av免费一区二区三区| 色香蕉成人二区免费| 亚洲图片在线播放| 欧美不卡在线视频| 手机亚洲第一页| 色吧影院999| 亚洲无线看天堂av| 欧美亚洲一级片| 国产在视频一区二区三区吞精| 成人免费黄色网| 亚洲视频一起| 蜜桃导航-精品导航| 久久精品不卡| 精品国偷自产一区二区三区| 首页亚洲欧美制服丝腿| 永久免费黄色片| 91麻豆视频网站| 久久久久久久久久97| 婷婷成人综合网| 亚洲一区二区天堂| 亚洲福利小视频| 福利在线播放| 久久久这里只有精品视频| 台湾成人免费视频| 国产精品国产精品| 日韩精品水蜜桃| 啊啊啊一区二区| 国产真实乱子伦精品视频| 精品无码在线视频| 综合久久久久久| 久久精品视频5| 日韩美女主播在线视频一区二区三区| 你懂的免费在线观看视频网站| 精品国产一区二区三区久久| 亚洲啊v在线| 91九色对白| 久久国产精品成人免费观看的软件| 亚洲人成无码网站久久99热国产| 蜜臂av日日欢夜夜爽一区| 黄色免费看视频| 亚洲另类一区二区| 一级片在线免费播放| 亚洲电影免费观看高清完整版在线观看| yiren22综合网成人| 97视频在线观看免费高清完整版在线观看| 欧美天堂一区二区| 日本一区二区在线视频| 亚洲福利电影| 国产伦理在线观看| 亚洲欧洲成人av每日更新| av一级在线观看| 亚洲精品720p| 男女羞羞视频在线观看| 91综合免费在线| 欧美激情国产在线| 九九视频精品在线观看| 26uuu国产电影一区二区| 国产在线视频在线观看| 欧美一卡二卡三卡四卡| 美女写真理伦片在线看| 国产精品久久一区| 国产欧美日韩影院| 男人天堂网视频| 91污片在线观看| 人妻 日韩精品 中文字幕| 亚洲国产精品字幕| 擼擼色在线看观看免费| 国产视频不卡| 亚洲精品1区2区| 欧美xxxxx精品| 天天影视色香欲综合网老头| 99在线影院| 黑人精品视频| 国产精品久久国产精品| 激情自拍一区| 麻豆精品国产传媒av| 亚洲h动漫在线| 午夜视频1000| 欧日韩不卡在线视频| 九九亚洲精品| 五月天婷婷激情视频| 欧美激情中文字幕| 中文字幕在线2018| 久久中文字幕一区| 136福利精品导航| 给我免费播放片在线观看| 国产成人在线网站| 日本熟妇色xxxxx日本免费看| 亚洲成色777777在线观看影院| 51精品在线| 欧美精品尤物在线| 免费在线观看精品| 波多野结衣在线网址| 欧美成人a视频| 正在播放日韩精品| 丝袜美腿玉足3d专区一区| 精油按摩中文字幕久久| 欧美成人精品欧美一| 日韩av一卡二卡| av在线日韩| 久久精品在线免费视频| 成人精品高清在线| 国产午夜精品久久久久| 日韩视频欧美视频| 高清精品视频| av免费网站观看| 自拍偷拍亚洲综合| 欧美自拍偷拍第一页| 国产成人+综合亚洲+天堂| 99re66热这里只有精品8| 99久久综合网| 色偷偷久久一区二区三区| 免费在线观看黄色| 国内成+人亚洲| 美女诱惑一区二区| 久艹视频在线观看| 亚洲一区二区久久| 一区二区三区在线资源| 天天摸天天碰天天添| 亚洲男同性视频| 日本私人网站在线观看| 国产一区二区在线免费视频| 亚洲国产免费看| 奇米网一区二区| 日韩成人激情在线| 麻豆一区在线| 欧美日韩亚洲自拍| 亚洲成av人片在www色猫咪| 最新真实国产在线视频|