簡體   English   中英

在Java中使用系統屬性

[英]Using System Properties in Java

我對在Java中使用系統屬性有疑問。 諸如Authenticator之類的某些類要求我們設置有關代理設置的系統屬性,然后驗證代理是否有效。

我的問題是使用完后應該刪除Set Properties嗎?

程序的其他部分可能正在使用這些屬性,此更改將自動影響其功能。

有沒有一種方法,我可以將局部屬性設置為函數(某些包裝類)?

設置和使用系統屬性的良好做法是什么?

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

因此,無需重新設置它們。 實際上,將它們設置回去可能會使某些API感到困惑,因為它們可能會假設它們一直都在獲取相關的值,而不僅僅是在讀取它們時將其緩存。

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

通常,由於線程和同步問題,可能最好的做法是僅在JVM啟動開始時(在命令行或主線程中,在啟動其他線程之前)設置系統屬性,並期望值在運行JVM的其余時間內保持不變。

這一般不會回答您有關系統屬性的問題,但是有關代理設置屬性的特定問題,也許您可​​以使用ProxySelector來隔離您在此處的注釋中提到的測試代理?

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

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

編輯:

我不確定如何錯過此方法,但是可以通過java.net.Url.openConnection(Proxy)單獨獲取URL連接並向該連接提供代理設置。

如果您的程序的某些其他部分(或容器中的其他Web應用程序等)可能會受到“臨時”設置的影響,則最好刪除它們。

最佳實踐是嘗試找到其他方法來完成您要嘗試做的事情。 例如,考慮創建自己的協議類,該協議類會在確定使用哪個代理的區域中覆蓋標准協議類。

如果您無法執行此操作,請嘗試對代碼進行結構化,以使順序如下:

  1. 更改屬性,
  2. 做手術,
  3. 恢復屬性,

在互斥量中完成,該互斥量受您所更改的屬性可能會影響的任何事物的尊重。 這可能是一個很難的問題...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM