这是从这个问题开始的,这个问题是关于Groovy(Java的超集/现代化(,其中似乎基本上没有信息隐藏和封装。
但是在Java中当然也有反射,这意味着private
,protected
和包私有本质上是毫无意义的,或者更糟的是:创造一种虚假的安全感。
在 Java 中,有没有办法强制执行某种类型的可见性,不一定是专门执行上述可见性修饰符的意义上,以及使用SecurityManager
的包私有?我才刚刚开始研究后者,我看不出任何非常明显的方法来完成这样的事情。但似乎一些开发人员必须在某些类和方法不完全公开可见性的地方发布代码......那么它是怎么做到的呢?
PS 在 Lucene 包中,我有点熟悉,我注意到很多类结果都是final
的(这有时会让我有些头疼......(但我很确定,虽然不确定,反射可以用来压制该修饰符
我可以编写我的类来设置可访问性证明,而不管 SecurityManager 配置如何?还是我受管理配置的人的摆布?
你不能,而且你肯定是。 任何有权访问您的代码的人都可以根据需要配置他们的JVM和SecurityManager。(更多详情如下(
设置合法吗?它为什么存在?
Java 核心类使用它作为访问出于安全原因必须保持私有的内容的简单方法。例如,Java 序列化框架使用它在反序列化对象时调用私有对象构造函数。有人提到了System.setErr,这将是一个很好的例子,但奇怪的是,System类方法setOut/setErr/setIn都使用本机代码来设置最终字段的值。
另一个明显的合法用途是需要窥视对象内部的框架(持久性,Web框架,注入(。
最后...
Java 访问修饰符不是一种安全机制。
那么我实际上能做什么呢?
您应该更深入地了解 Java SE 安全性文档的安全提供程序部分:
应用程序不需要自己实现安全性。而 他们可以从 Java 平台请求安全服务。安全 服务在提供商中实现
Java 平台中的访问控制体系结构保护对敏感资源(例如,本地文件(或敏感应用程序代码(例如,类中的方法(的访问。所有访问控制决策都由java.lang.SecurityManager
类表示的安全管理器调解。必须将安全管理器安装到 Java 运行时才能激活访问控制检查。
Java小程序和 Java™ Web Start 应用程序在安装了 SecurityManager 的情况下自动运行。但是,默认情况下,通过java
命令执行的本地应用程序不会在安装了 SecurityManager 的情况下运行。为了使用 SecurityManager 运行本地应用程序,应用程序本身必须通过setSecurityManager
方法(在java.lang.System
类中(以编程方式设置一个应用程序,或者必须在命令行上使用-Djava.security.manager
参数调用 java。
我建议您在官方安全文档中进一步阅读有关此内容的信息
https://docs.oracle.com/javase/7/docs/technotes/guides/security/overview/jsoverview.html