0
我现在正在寻找一种方法来监视JVM的默认语言环境,也就是说,无论何时调用Locale.setDefault
,都会自动执行侦听器方法。如何为语言环境更改添加侦听器?
也许一些字节码工程或AOP库可以工作,但我不熟悉它们......任何想法?
我现在正在寻找一种方法来监视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类是可能的(我以前做过的话),但不平凡,超出了这个答案的范围。但是如果例如这些调用来自你的控制库,你仍然可以在库上执行二进制或加载时编织(即使在第三方库上),使JDK不变。
通常,如果要编织到call
连接点,则需要编织调用者,如果要编织到execution
连接点,则需要编织被调用者。你拥有哪些选项总是取决于你可以控制的代码。
我需要监视所有对'Locale.setDefault'的调用,所以我必须编入JRE类,对吧?你能显示代码吗?非常感谢! – 2013-05-06 04:12:33
正如我所说的,如果你想编织被调用者而不是调用者,只需交换'执行'调用''。你确定这是必要的吗?编织调用代码会更容易,即使它是可以通过LTW处理的第三方库。 – kriegaex 2013-05-06 08:27:19
我认为我需要的是RTW,但AspectJ 5还没有支持它(请参阅http://www.eclipse.org/aspectj/doc/next/devguide/ltw.html)。无论如何,非常感谢你的回答。如果没有更好的想法出来,我会标记你的答案被接受。 – 2013-05-07 02:17:35