mis*_*tor 3 java reflection io
我遇到了这个课java.io.FileSystem,发现它有很多我目前在项目中需要的方法.但是这个类是包私有的,所以我使用反射访问所需的方法.
问题:
这个类是私有的,因为SUN(以及扩展,Oracle)认为这个依赖于平台的类的方法将来可能会发生重大变化,因此不能直接访问.此抽象类的所有实现都使用本机代码; Java程序员不应该自己创建.
通过反射使用隐藏类的最大危险不是性能,而是一种非常实际的可能性,即它的方法甚至整个类在JDK的下一次升级中都会消失,无论多么微小.非公共API是非公开的; 即使在维护版本中,更改它们也是公平的游戏,因此如果您的程序在看似常规的JDK更新之后停止工作,那么您只能责怪自己.
有没有什么特别的理由为什么这个类被标记为包私有?
包私有的原因是告诉你它不是你应该使用的API.这样做的标准原因是Java团队可以在将来的版本中自由更改API.第二个原因可能是API中的方法具有限制/限制,使其不适合一般使用.例如,可能存在安全隐患,或者您的呼叫会"破坏"其他内容的风险.或者这些方法可能只是在javadoc中解释得太过分了.
通过反射访问它有危险吗?
如果您反复使用这些方法,我上面列出的原因也适用.
有没有什么特别的理由为什么这个类被标记为包私有?
是.java.io.FileSystem不是Java API的一部分.无法保证如何以及是否有效.它可能会在下一版本中删除或更改.事实上,除了Oracle之外,每个Java实现中最有可能丢失它.
java.io.File 在内部使用此类,因此它应以某种方式暴露其大部分功能.
通过反射访问它有危险吗?(除了性能命中,即.)
你正在避免,SecurityManager所以它不适用于此.