在Java中使用系统属性

时间:2009-08-28 12:54:21

标签: java properties system

我有一个关于在Java中使用系统属性的问题。像Authenticator这样的类要求我们设置有关代理设置的系统属性,而不是验证代理是否有效。

我的问题是,在使用完毕后我应该删除设置属性吗?

程序的其他部分可能正在使用这些属性,此更改将自动影响其功能。

有没有办法,我可以设置一个函数局部属性(一些包装类)?

设置系统属性和使用它们的好方法是什么?

3 个答案:

答案 0 :(得分:3)

使用System.properties的东西应该具有对正在运行的JVM具有全局意义的属性,因此,例如,如果您设置代理,它应该是该流程中的相关代理。

因此,没有必要将它们设置回来。实际上,将它们设置回来可能会使一些API混淆,因为它们可能会假设它们始终返回相关值,并且不会在读取它时将其缓存。

当然,如果给定的API没有以这种方式使用它们,那么您可能会遇到问题,但这确实是给定API的问题,而不仅仅是系统属性的良好实践问题。

通常,由于线程和同步问题,仅在JVM启动开始时(在命令行上或在启动其他线程之前的主线程中)设置系统属性可能是一个好习惯。在运行JVM的剩余时间内值保持不变。

答案 1 :(得分:1)

这一般不会回答您关于系统属性的问题,但是关于代理设置属性的具体问题,也许您可​​以使用ProxySelector来隔离您在此处的评论中提到的测试代理?

您可以创建用于测试的ProxySelector的子类。使其仅在尝试测试URI时应用测试设置。这会将其与其他请求隔离开来。

这种全局代理设置缺乏灵活性最初促使我使用HttpClient来代替Sun的API。

编辑:

我不确定我是如何错过这种方法的,但是可以通过java.net.Url.openConnection(Proxy) 获得URL连接并仅为该连接提供代理设置。

答案 2 :(得分:0)

如果您的程序的某些其他部分(或容器中的某些其他Web应用程序)可能会受到“临时”设置的影响,则最好将其删除。

最佳做法是尝试寻找其他方式来做你想做的事情。例如,考虑创建自己的协议类,该协议类覆盖了它要确定使用什么代理的区域中的标准协议类。

如果您不能这样做,请尝试构建代码以使序列:

  1. 更改属性,
  2. 做手术,
  3. 恢复属性,
  4. 在互斥锁中完成,该互斥锁受到您正在更改的属性可能影响的任何内容的尊重。这可能是一个很难的问题......