Java 如何优雅地在 main 方法执行前后执行代码

2023-11-10 12:57:44 +08:00
 objcat

白猫今天被难翻了, 研究了一上午也没有找到「如何在 main 方法执行前后执行代码」, 提这个问题的目的是, 我今天准备做个统计代码运行时间的工具, 这个非常简单, 就不多说了, 但是每次运行 main 方法的时候都要使用统计工具进行统计就很不雅观

public static void main(String[] args) {
    ZYTime time = new ZYTime();
    System.out.println("hello world!");
    time.stop();
}

所以我想的是在main方法上加一个注解可以hook到方法执行前后的时刻, 比如

public class Solution1 {
    @StatisticalTime
    public static void main(String[] args) {
        System.out.println("hello world!");
    }
}

我只想在这个解题的文件中优雅的统计执行时间, 请大神支招, 所谓优雅就是做完前置工作之后, 在真正需要用到功能的地方可以无痛使用, 除了注解还有没有其他解法呢, 白猫拜谢

2335 次点击
所在节点    Java
15 条回复
pocketz
2023-11-10 13:15:02 +08:00
从 class loader 入手?
Helsing
2023-11-10 13:19:03 +08:00
代码插桩啊,很成熟的方案了
tool2d
2023-11-10 13:20:40 +08:00
说起来可能 OP 不信,我把所有的 java 都做了一个源代码级别的 processor ,直接一个#define 搞定一切。
Ayanokouji
2023-11-10 13:21:26 +08:00
搜 java agents
chendy
2023-11-10 13:23:29 +08:00
能用的方法很多很多,看你的需求和场景:
1. 直接另起一个 java 进程,在外面统计时间
2. 直接调用这个 main 方法,统计时间
3. 批量处理代码文件,插上计时器再编译
等等等等…
janwarlen
2023-11-10 13:29:25 +08:00
arloor
2023-11-10 13:41:28 +08:00
agent premain
aragakiyuii
2023-11-10 13:42:43 +08:00
改 MANIFEST.MF
cslive
2023-11-10 13:53:48 +08:00
java agents
v2e0xAdmin2
2023-11-10 13:55:10 +08:00
java agent premain
yidinghe
2023-11-10 13:58:18 +08:00
···
public class JavaLangTest {

static {
System.out.println("22222");
}

public static void main(String[] args) {
System.out.println("11111");
}
}
···

猜猜上面这段代码先输出 11111 还是 22222 ?
yidinghe
2023-11-10 14:00:40 +08:00
https://gist.github.com/yiding-he/78b02282ec27c4ae7b7dc31ee45fa64f

猜猜上面这段代码先输出 11111 还是 22222 ?
wang944294368
2023-11-10 14:57:44 +08:00
jvm-sandbox
ihuotui
2023-11-10 22:15:20 +08:00
agent 技术,asm 或者 javassist
Aresxue
2023-11-13 11:26:47 +08:00
1.agent + 字节码改写 这个组合几乎可以做任何事情,但引入 agent 其实是个成本很高的事情还是要慎重;
2.静态代理 对方法有入侵;
3.定义一个函数把 main 传进去;
4.字节码改写有三个时机,编译期织入、装载期织入、运行期织入,完全可以像 lombok 那样做一个编译期织入的注解,关键词 AbstractProcessor ;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/990640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX