2013-04-27 86 views
0

我现在正在寻找一种方法来监视JVM的默认语言环境,也就是说,无论何时调用Locale.setDefault,都会自动执行侦听器方法。如何为语言环境更改添加侦听器?

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

回答

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类是可能的(我以前做过的话),但不平凡,超出了这个答案的范围。但是如果例如这些调用来自你的控制库,你仍然可以在库上执行二进制或加载时编织(即使在第三方库上),使JDK不变。

通常,如果要编织到call连接点,则需要编织调用者,如果要编织到execution连接点,则需要编织被调用者。你拥有哪些选项总是取决于你可以控制的代码。

+0

我需要监视所有对'Locale.setDefault'的调用,所以我必须编入JRE类,对吧?你能显示代码吗?非常感谢! – 2013-05-06 04:12:33

+0

正如我所说的,如果你想编织被调用者而不是调用者,只需交换'执行'调用''。你确定这是必要的吗?编织调用代码会更容易,即使它是可以通过LTW处理的第三方库。 – kriegaex 2013-05-06 08:27:19

+0

我认为我需要的是RTW,但AspectJ 5还没有支持它(请参阅http://www.eclipse.org/aspectj/doc/next/devguide/ltw.html)。无论如何,非常感谢你的回答。如果没有更好的想法出来,我会标记你的答案被接受。 – 2013-05-07 02:17:35