这是从this question开始的......这是关于Groovy(= Java的超集/现代化),其中似乎基本上没有信息隐藏和任何封装。
但是在Java中当然也存在反思,这意味着private
,protected
和package-private基本上没有意义,或者更糟:创建一种虚假的安全感。
在Java中,有没有办法强制实现某种可见性,不一定是专门执行上述可见性修饰符,而是使用SecurityManager
实现包私有?我只是刚刚开始研究后者,我无法看到任何非常明显的方式来完成这样的事情。但似乎有些开发人员必须提供代码,而某些类和方法没有完全公开的可见性......那么它是如何完成的呢?
PS在Lucene包中,我对此很熟悉,我注意到很多课程都变成了final
(这有时让我有些头疼......)但我很确定,虽然不确定,反射可以用来压缩修改器。
Downvotes
啊,不,你必须礼貌地说出为什么会这样。这不是一个愚蠢的问题,现在你的downvote暗示你不明白这个问题。
答案 0 :(得分:0)
无论SecurityManager配置如何,我都可以将我的类编写为setAccessible-proof吗? ......或者我是否受到管理配置的人的支配?
你不可能而且你肯定是。 任何有权访问您的代码的人都可以随意配置他们的JVM和SecurityManager。 (详情如下)
setAcessible合法吗?它为什么存在?
Java核心类使用它作为一种简单的方法来访问因安全原因必须保持私有的内容。例如,Java Serialization框架在反序列化对象时使用它来调用私有对象构造函数。有人提到System.setErr,这将是一个很好的例子,但奇怪的是,System类方法setOut / setErr / setIn都使用本机代码来设置final字段的值。
另一个明显的合法用途是需要查看对象内部的框架(持久性,Web框架,注入)。
最后......
Java访问修饰符不是一种安全机制。
那我该怎么做呢?
您应该深入了解Java SE Security文档的安全提供程序部分:
应用程序不需要自己实现安全性。相反, 他们可以从Java平台请求安全服务。安全 服务在提供者中实施
Java平台中的访问控制体系结构保护对敏感资源(例如,本地文件)或敏感应用程序代码(例如,类中的方法)的访问。所有访问控制决策都由安全管理器调解,由java.lang.SecurityManager
类表示。必须在Java运行时中安装SecurityManager才能激活访问控制检查。
Java applet和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