如果使用反射可以绕过访问修饰符,那么访问修饰符的目的是什么?

8

我知道在编写Java(或大多数)代码时使用访问修饰符是一种重要的实践,但是通过使用反射,这不会有效地变得多余吗?

例如,如果我想通过将变量设置为私有并提供访问器方法来保护对象的敏感变量,某人仍然可以轻松绕过这些限制,可能设置不安全的值。为什么Java提供访问修饰符,然后提供一个绕过它们的工具呢?似乎不使用任何一个都更容易。


18
为什么你还是可以破门而入,我却要锁上门? - Tom
3
您可以配置一个SecurityManager来防止反射。 - Marvin
5
访问修饰符大多数情况下都能够防止人们无意间做一些不该做的事情。但是如果有人刻意想要做不该做的事情,你其实无法完全阻止他们。如果他们通过反射来设置某个值,而库/框架/其他工具不能按预期工作,那就没办法了。 - Michael
1
就像Michael所解释的那样,增加难度确实是一个原因,但你可以通过“谁”(类)和“在哪里”(包)来防止意外,并展示你打算如何使用代码。 - Tom
1
“你可以使用反射来绕过这些修饰符”——但如果目标类在不同的未打开模块中,则无法实现。 - VGR
显示剩余9条评论
2个回答

9

访问修饰符的一个重要目的是为了构造代码,帮助使用该代码的用户有效且正确地理解和使用它。这与充当防篡改安全机制不同。因此,拥有访问修饰符和反射并不矛盾。代码编写人员可以使用访问修饰符表达其意图,需要绕过它们的代码(出于任何原因)可以以通常的风险和影响来执行。


1
我认为修改器的优点在于您可以更快地了解如何使用文件/库。 您无法访问私有字段/方法,而不使用反射。
如果您想防止攻击者使用反射,则JVM具有安全机制,允许您通过Java安全策略文件定义对代码的限制。 它将使用默认值,除非您另行指定。
使用SecurityManager和足够严格的安全策略运行应用程序,可以在此处找到策略here
您可能会发现这个教程很有用:http://docs.oracle.com/javase/tutorial/essential/environment/security.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接