1

伸手: Java 有没有哪个注解可以在编译时插入当前时间,我想在代码里直接得到编译时间...

 1 year ago
source link: https://www.v2ex.com/t/930978
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Java

伸手: Java 有没有哪个注解可以在编译时插入当前时间,我想在代码里直接得到编译时间🤔

  xiangyuecn · xiangyuecn · 4 小时 59 分钟前 · 921 次点击

搜了半天没搜到,只有伸手了

比如给类加上这个注解,会直接在类源码里面添加一个可以使用的静态字符串变量

或者给一个字符串变量加上这个注解,编译时自动注入一个值


不考虑使用配置文件 翻了翻 lombok ,似乎没有现成的,难不成要自己写一个编译期注解😂

感觉这种需求挺多的吧,一个 class 文件里面自带了编译时间,能省不少事

16 条回复    2023-04-09 19:03:20 +08:00
sfc9982

sfc9982      4 小时 52 分钟前

将编译时间保存在 Manifest 文件中,然后从代码中读取 Manifest 里的时间戳?
learningman

learningman      4 小时 50 分钟前 via Android   ❤️ 1

用 gradle 的话,写 task 在 build 之前 codegen 。
挺多这种插件的,比如 buildKonfig
Azzsanjin

Azzsanjin      4 小时 38 分钟前 via Android

这应该和代码无关吧 得研究 jvm
xiangyuecn

xiangyuecn      4 小时 30 分钟前

@Azzsanjin 参考 lombok.extern.slf4j.Slf4j ,给类注解 @Slf4j 后,编译时会往代码里插入 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(XXX.class)

实现一个编译期插入 public static final String BuildTime="2023-04-09 14:49:51" 类似的注解应该是可行的吧
diagnostics

diagnostics      4 小时 24 分钟前

bytebuddy ,asm ,javassist ,看 CTW 就可以了,一般是改字节码
forgottencoast

forgottencoast      3 小时 59 分钟前

自己写个脚本,生成时间戳文件,编译的时候顺带执行这个脚本。
这个应该比较容易实现吧。
Achieve7

Achieve7      3 小时 30 分钟前

一般都是 字节码织入, 比如 asm javasssist. 可以看一下 spring-aop 的源码, 写的挺详细的
ychost

ychost      3 小时 27 分钟前

Maven 插件搞一个就行了,别去卷 java APT 了,用 maven 插件或者 Gradle 插件更简洁,更快
someonedeng

someonedeng      2 小时 52 分钟前

编译的时候脚本 sed 一下代码 改一下不就得了
weofuh

weofuh      56 分钟前

如果只是修改一个源码文件里的某个变量,如:string version = "1.0" maven 编译时设置一个新的版本号 version = “1.1” ,那可以用 replacer 插件来实现,比如 com.google.code.maven-replacer-plugin:replacer
zhady009

zhady009      43 分钟前

换个思路不要直接注入进 JVM 内部,从外部文件读取就好了
如果是 SpringBoot 项目可以读 build-info.properties
williamx

williamx      31 分钟前

@someonedeng +1 ,反正要写编译脚本,直接 sed 修改,懒得去研究各种编译框架。
ingxx

ingxx      29 分钟前

JSR269 编译时修改语法树试试呢
MakHoCheung

MakHoCheung      27 分钟前

Java 的 Annotation Processing Tool
k9982874

k9982874      18 分钟前 via Android

源码里面 public final String compileDate = "{COMPILE_DATE}";
maven 或 gradle 编译前执行 sed 替换指定文件里的{COMPILE_DATE},编译结束替换回{COMPILE_DATE}简单粗暴

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK