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