如何为区域设置更改添加侦听器?

时间:2013-04-27 09:51:22

标签: java listener locale aop

我现在正在寻找一种监视JVM默认语言环境的方法,也就是说,每当调用Locale.setDefault时,都会自动执行监听器方法。

也许某些字节码工程或AOP库可以工作,但我不熟悉它们......有什么想法吗?

1 个答案:

答案 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个连接点,你需要编织被调用者。您拥有哪些选项始终取决于您可以控制的代码。