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

180 天前
 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!");
    }
}

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

2024 次点击
所在节点    Java
15 条回复
pocketz
180 天前
从 class loader 入手?
Helsing
180 天前
代码插桩啊,很成熟的方案了
tool2d
180 天前
说起来可能 OP 不信,我把所有的 java 都做了一个源代码级别的 processor ,直接一个#define 搞定一切。
Ayanokouji
180 天前
搜 java agents
chendy
180 天前
能用的方法很多很多,看你的需求和场景:
1. 直接另起一个 java 进程,在外面统计时间
2. 直接调用这个 main 方法,统计时间
3. 批量处理代码文件,插上计时器再编译
等等等等…
janwarlen
180 天前
arloor
180 天前
agent premain
aragakiyuii
180 天前
改 MANIFEST.MF
cslive
180 天前
java agents
v2e0xAdmin2
180 天前
java agent premain
yidinghe
180 天前
···
public class JavaLangTest {

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

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

猜猜上面这段代码先输出 11111 还是 22222 ?
yidinghe
180 天前
https://gist.github.com/yiding-he/78b02282ec27c4ae7b7dc31ee45fa64f

猜猜上面这段代码先输出 11111 还是 22222 ?
wang944294368
180 天前
jvm-sandbox
ihuotui
180 天前
agent 技术,asm 或者 javassist
Aresxue
177 天前
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