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

Java 如何为区域设置更改添加侦听器?,java,listener,locale,aop,Java,Listener,Locale,Aop,我现在正在寻找一种监视JVM默认区域设置的方法,即,每当调用locale.setDefault时,都会自动执行侦听器方法 也许一些字节码工程或AOP库可以工作,但我不熟悉它们。。。有什么想法吗?AspectJ非常简单: 示例驱动程序类 package de.scrum\u master.aop; 导入java.util.Locale; 公共类应用程序{ 公共静态void main(字符串[]args){ setDefault(Locale.derman); setDefault(Locale.F

我现在正在寻找一种监视JVM默认区域设置的方法,即,每当调用
locale.setDefault
时,都会自动执行侦听器方法


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

AspectJ非常简单:

示例驱动程序类

package de.scrum\u master.aop;
导入java.util.Locale;
公共类应用程序{
公共静态void main(字符串[]args){
setDefault(Locale.derman);
setDefault(Locale.FRENCH);
setDefault(Locale.ENGLISH);
}
}
拦截方面

package de.scrum\u master.aop;
导入java.util.Locale;
公共方面DefaultLocaleWatchdog{
after():调用(*Locale.setDefault(*){
System.out.println(“默认区域设置已更改为”+locale.getDefault());
}
}
输出

默认区域设置已更改为de
默认语言环境已更改为fr
默认语言环境已更改为en
顺便说一句,如果语言环境是由不受您控制的代码更改的,并且您无法将代码编入其中,那么您需要将
执行
建议编入JDK/JRE类中,这是可能的(我以前已经做过),但不是琐碎的,并且超出了本答案的范围。但是,如果调用来自您控制下的libs,您仍然可以在libs上执行二进制或加载时编织(即使是在第三方libs上),使JDK保持不变


通常,如果要编织成
call
joinpoints,则需要编织调用者;如果要编织成
execution
joinpoints,则需要编织被调用者。您始终拥有哪些选项取决于您可以控制哪些代码。

我需要监视对
Locale.setDefault
的所有调用,所以我必须编织到JRE类中,对吗?你能出示密码吗?谢谢!正如我所说,如果您想编织被调用方而不是调用方,只需将
call
交换为
execution
。你真的确定这是必要的吗?编写调用代码会更容易,即使它是第三方LIB,您可以通过LTW来处理。我想我需要的是RTW,但从AspectJ 5开始还不支持它(请参阅)。无论如何,非常感谢你的回答。如果没有更好的主意,我会把你的答案标记为接受。我已经找到了解决方案,那就是将
java.lang.instrunment
与BCEL框架结合使用。正如我所承诺的,我仍然会接受你的回答,毕竟它可以部分解决问题。再次感谢!是的,AspectJ内部也使用了BCEL的黑客版本,尽管已经讨论过切换到ASM。因为我很好奇:你给JDK类或调用者装上仪器了吗?您是在运行时做的,还是在磁盘上创建了一个插入指令的JDK?