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