我现在正在寻找一种监视JVM默认语言环境的方法,也就是说,每当调用Locale.setDefault
时,都会自动执行监听器方法。
也许某些字节码工程或AOP库可以工作,但我不熟悉它们......有什么想法吗?
答案 0 :(得分:0)
使用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类中(这是我之前做过的) ),但非平凡且超出了这个答案的范围。但是,例如,这些调用来自你控制下的libs,你仍然可以在libs上进行二进制或加载时编织(甚至是第三方编译),使你的JDK保持不变。
通常,如果你想编织成call
个连接点,你需要编织调用者,如果你想编织execution
个连接点,你需要编织被调用者。您拥有哪些选项始终取决于您可以控制的代码。