我现在正在寻找一种方法来监控JVM的默认语言环境,即无论何时Locale.setDefault
调用,都会自动执行一个监听器方法。
也许一些字节码工程或 AOP 库可以工作,但我不熟悉它们......有什么想法吗?
使用 AspectJ 非常简单:
示例驱动程序类
package de.scrum_master.aop;
import java.util.Locale;
public class Application {
public static void main(String[] args) {
Locale.setDefault(Locale.GERMAN);
Locale.setDefault(Locale.FRENCH);
Locale.setDefault(Locale.ENGLISH);
}
}
拦截方面
package de.scrum_master.aop;
import java.util.Locale;
public aspect DefaultLocaleWatchdog {
after() : call(* Locale.setDefault(*)) {
System.out.println("Default locale has been changed to " + Locale.getDefault());
}
}
输出
Default locale has been changed to de
Default locale has been changed to fr
Default locale has been changed to en
顺便说一句,如果语言环境由不受您控制且您无法编织的代码更改,您需要将execution
建议编织到 JDK/JRE 类中,这是可能的(我以前做过),但不是微不足道的和超越这个答案的范围。但是,如果调用来自您控制的库,您仍然可以在库上进行二进制或加载时编织(即使在第 3 方库上),而不会影响您的 JDK。
一般来说,如果你想编织成call
连接点,你需要编织调用者,如果你想编织成execution
连接点,你需要编织被调用者。您始终拥有哪些选项取决于您可以控制哪些代码。