在 Java 和 C# 中,都可以通过反射调用私有方法(如下所示)。
- 为什么这是允许的?
- 这样做会产生什么后果?
- 是否应该在该语言的未来版本中删除它?
- 其他语言/平台是否允许这样做?如果我在 Java 和 C# 中都有此类
这是例子
public class Foo
{
private void say() { WriteToConsoleMethod("Hello reflected world"); }
}
where WriteToConsole()
是特定于语言的,那么我可以运行以下命令来调用私有say()
method:
C#
Foo f = new Foo();
var fooType = f.GetType();
var mi = fooType.GetMethod("say", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(f, null);
Java
Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null);
method.setAccessible(true);
method.invoke(f, null);
正如您所看到的,这并不明显,但也不难。
在 Java 和 .NET 中,只有当您拥有足够的权限时才允许这样做。直接从命令行运行的代码(通常)在“完全信任”模式下运行。如果你尝试在更严格的环境中做同样的事情,它就会失败。不过,访问控制更多的是关于封装而不是安全性。如果您在完全信任的情况下操作,您可能有足够的访问权限来启动本机方法来直接浏览内存......
为什么允许?有时它可以很方便。它应该小心对待,但它可能是有用的。
有何影响?你的代码变得脆弱;你正在以一种类型不期望的方式与它交互。
是否应该在该语言的未来版本中删除它?首先,它是一个平台功能而不是语言功能,但我不认为它应该被删除。
其他语言/平台允许这样做吗?我不确定……不过我不会感到惊讶。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)