0

我现在正在寻找一种方法来监控JVM的默认语言环境,即无论何时Locale.setDefault调用,都会自动执行一个监听器方法。

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

4

1 回答 1

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 类中,这是可能的(我以前做过),但不是微不足道的和超越这个答案的范围。但是,如果调用来自您控制的库,您仍然可以在库上进行二进制或加载时编织(即使在第 3 方库上),而不会影响您的 JDK。

一般来说,如果你想编织成call连接点,你需要编织调用者,如果你想编织成execution连接点,你需要编织被调用者。您始终拥有哪些选项取决于您可以控制哪些代码。

于 2013-05-03T10:30:08.970 回答