为什么java.io.FileSystem包是私有的?

时间:2012-06-02 11:19:20

标签: java reflection io

我遇到了这个班级java.io.FileSystem并注意到它在我的项目中目前需要很多方法。但是这个类是包私有的,所以我使用反射访问所需的方法。

问题:

  1. 为什么这个类被标记为包私有,有什么特别的原因吗?
  2. 通过反思访问它有危险吗? (除了性能命中,即。)

3 个答案:

答案 0 :(得分:7)

  1. 此类是包私有的,因为SUN(以及扩展名为Oracle)认为此平台相关类的方法将来可能会发生重大变化,因此不能直接访问。此抽象类的所有实现都使用本机代码; Java程序员不应该创建自己的。

  2. 通过反射使用隐藏类的最大危险不是性能,而是一种非常现实的可能性,即它的方法甚至整个类在JDK的下一次升级中都会消失,无论多么轻微。非公共API是非公开的;即使在维护版本中更改它们也是公平的游戏,所以如果您的程序在看似常规的JDK更新之后停止工作,那么您只能责怪自己。

答案 1 :(得分:6)

  

为什么这个类被标记为包私有,有什么特别的原因吗?

是。 java.io.FileSystem不是Java API的一部分。无法保证如何以及是否有效。它可能会在下一版本中删除或更改。实际上,除了Oracle之外的每个Java实现中,它很可能都会丢失。

java.io.File在内部使用此类,因此它应以某种方式公开其大部分功能。

  

通过反思访问它有危险吗? (除了表现之外,也就是说。)

您正在避免使用SecurityManager,因此无法使用此功能。

答案 2 :(得分:5)

  

为什么这个类被标记为包私有,有什么特别的原因吗?

它是包私有的原因是告诉你它不是你应该使用的API。这样做的标准原因是Java团队可以在将来的版本中自由更改API。第二个原因可能是API中的方法具有限制/限制,使其不适合一般使用。例如,可能存在安全隐患,或者您的呼叫会“破坏”其他内容的风险。或者方法可能只是太粗糙来在javadoc中解释。

  

通过反思访问它有危险吗?

如果您反复使用这些方法,我上面列出的原因也适用。