白猫今天被难翻了, 研究了一上午也没有找到「如何在 main 方法执行前后执行代码」, 提这个问题的目的是, 我今天准备做个统计代码运行时间的工具, 这个非常简单, 就不多说了, 但是每次运行 main 方法的时候都要使用统计工具进行统计就很不雅观
public stati 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!"); } }
我只想在这个解题的文件中优雅的统计执行时间, 请大神支招, 所谓优雅就是做完前置工作之后, 在真正需要用到功能的地方可以无痛使用, 除了注解还有没有其他解法呢, 白猫拜谢
![]() | 1 pocketz 2023-11-10 13:15:02 +08:00 从 class loader 入手? |
![]() | 2 Helsing 2023-11-10 13:19:03 +08:00 via iPhone 代码插桩啊,很成熟的方案了 |
![]() | 3 tool2d 2023-11-10 13:20:40 +08:00 说起来可能 OP 不信,我把所有的 java 都做了一个源代码级别的 processor ,直接一个#define 搞定一切。 |
4 Ayanokouji 2023-11-10 13:21:26 +08:00 搜 java agents |
![]() | 5 chendy 2023-11-10 13:23:29 +08:00 能用的方法很多很多,看你的需求和场景: 1. 直接另起一个 java 进程,在外面统计时间 2. 直接调用这个 main 方法,统计时间 3. 批量处理代码文件,插上计时器再编译 等等等等… |
![]() | 6 janwarlen 2023-11-10 13:29:25 +08:00 ![]() https://github.com/JanWarlen/JavaPractice/tree/master/ThirdPartyComponents/TransformClasses agent 技术,asm 或者 javassist 阿里有个很好用的工具 https://arthas.aliyun.com/ |
![]() | 7 arloor 2023-11-10 13:41:28 +08:00 via Android agent premain |
![]() | 8 aragakiyuii 2023-11-10 13:42:43 +08:00 via Android 改 MANIFEST.MF |
9 cslive 2023-11-10 13:53:48 +08:00 java agents |
![]() | 10 v2e0xAdmin2 2023-11-10 13:55:10 +08:00 java agent premain |
![]() | 11 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 ? |
![]() | 12 yidinghe 2023-11-10 14:00:40 +08:00 |
13 wang944294368 2023-11-10 14:57:44 +08:00 ![]() jvm-sandbox |
![]() | 14 huotui 2023-11-10 22:15:20 +08:00 agent 技术,asm 或者 javassist |
![]() | 15 Aresxue 2023-11-13 11:26:47 +08:00 1.agent + 字节码改写 这个组合几乎可以做任何事情,但引入 agent 其实是个成本很高的事情还是要慎重; 2.静态代理 对方法有入侵; 3.定义一个函数把 main 传进去; 4.字节码改写有三个时机,编译期织入、装载期织入、运行期织入,完全可以像 lombok 那样做一个编译期织入的注解,关键词 AbstractProcessor ; |