我有一个关于在Java中使用系统属性的问题。像Authenticator这样的类要求我们设置有关代理设置的系统属性,而不是验证代理是否有效。
我的问题是,在使用完毕后我应该删除设置属性吗?
程序的其他部分可能正在使用这些属性,此更改将自动影响其功能。
有没有办法,我可以设置一个函数局部属性(一些包装类)?
设置系统属性和使用它们的好方法是什么?
答案 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应用程序)可能会受到“临时”设置的影响,则最好将其删除。
最佳做法是尝试寻找其他方式来做你想做的事情。例如,考虑创建自己的协议类,该协议类覆盖了它要确定使用什么代理的区域中的标准协议类。
如果您不能这样做,请尝试构建代码以使序列:
在互斥锁中完成,该互斥锁受到您正在更改的属性可能影响的任何内容的尊重。这可能是一个很难的问题......