2013-04-27 43 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