2009-08-28 44 views
2

我有一個關於在Java中使用系統屬性的問題。像Authenticator這樣的類需要我們設置有關代理設置的系統屬性,並驗證代理是否有效。在Java中使用系統屬性

我的問題是我應該在完成使用後刪除Set屬性?

還有一些可能使用這些屬性的程序的其他部分,這種更改會自動影響他們的功能。

有沒有辦法,我可以設置屬性本地函數(一些包裝類)?

設置系統屬性並使用它們的最佳做法是什麼?

回答

3

使用System.properties的東西應該具有對正在運行的JVM具有全局含義的屬性,例如,如果您設置了代理,則它應該是該進程中的相關代理。

因此,沒有必要設置它們。事實上,將它們設置回來可能會讓一些API混淆,因爲它們可能會認爲它們隨時獲得相關的值,並且在讀取它時不會將其緩存。

當然,如果給定的API沒有以這種方式使用它們,那麼您可能會遇到問題,但這對於給定的API來說確實是一個問題,而不僅僅是系統屬性的良好實踐問題。

一般來說,由於線程和同步問題,在系統屬性的設置中,只能在JVM啓動開始時(在啓動其他線程之前在命令行或主線程中)設置系統屬性期望值在運行JVM的剩餘時間內保持不變。

+0

我同意。我的問題是我想添加一個測試代理按鈕,並且有人可能會在其中輸入一個錯誤的代碼:-(另外還有另一個使用此代理設置的線程。因此,如果我將屬性設置爲測試的錯誤值,最初使用的是不同的值將會失敗 – Geek 2009-08-28 13:20:01

+0

聽起來像API的問題,你能詳細說明你正在設置哪些系統屬性嗎?可能有解決方法。 – Yishai 2009-08-28 13:30:12

0

如果您的程序的某些其他部分(或容器中的其他一些web應用程序等)可能受到「臨時」設置的影響,那麼刪除它們是一個不錯的主意。

最好的做法是嘗試找一些其他方式來做你想做的事情。例如,考慮創建一個自己的協議類來覆蓋標準區域,在該區域中找出要使用的代理。

如果你不能做到這一點,嘗試構建你的代碼,這樣的順序:

  1. 變化的特性,
  2. 做了手術,
  3. 恢復性質,

是在一個互斥體中完成的,任何可能受到你正在改變的屬性影響的互斥體都會遵守這個互斥體。這可能是一個難問,雖然...

1

這不會回答你關於一般系統屬性的問題,但關於你的代理設置屬性的具體問題,也許你可以使用ProxySelector隔離你提到的測試代理在這裏的評論?

您可以創建您用於測試的ProxySelector的子類。使它在測試URI嘗試時僅適用測試設置。這會將其與其他請求隔離。

這種全局代理設置不靈活性最初驅使我使用HttpClient來滿足HTTP需求,而不是Sun的API。

編輯:

我不知道我怎麼過錯過了這個方法,但它有可能獲得一個URL連接,並通過java.net.Url.openConnection(Proxy) 單獨提供代理設置該連接。