.net - 为什么反射有效(ECMA-335 调用私有(private)方法)?

标签 .net reflection

这个问题有两个事实: 1)通过反射可以调用私有(private)方法。 2) TypeBuilder 无法从另一个程序集构建新类型“继承”形式的内部类型。

我可以使用 ECMA-335 解释 TypeBuilder 的行为——如果类型没有“标记为导出”,它是不可见的,继承需要可见性。

但我无法解释为什么反射有效?

ECMA 规范使用反射在运行时合法访问元数据,并提到了一个应用程序 - 序列化,这意味着访问状态,字段。还有一句“元数据描述如何解析调用”,但我在文本中找不到可以忽略方法的可访问性来解决调用的情况。可能我错过了什么。有人能给我解释一下 ECMA 作者是如何为私有(private)方法调用敞开大门的吗(至少为了反射(reflection),顺便说一句,“如果特别指定,可以忽略成员可访问性”——但我在文本,再次)?

最佳答案

这里只是一个猜测,但是对于验证托管代码的类型安全和可信度等事情的静态分析需要查看类类型的所有部分——公共(public)接口(interface)和私有(private)字段。如果一个类包含一个不安全类型的私有(private)字段,那么这个类本身的类型安全就有问题了。

如果私有(private)成员在反射 API 中不可见,则类型安全的静态分析将不可能进行,或者会非常不完整。

关于.net - 为什么反射有效(ECMA-335 调用私有(private)方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4252092/

相关文章:

c# - 为什么有时 WebBrowser.Dispose() 会启动 Internet Explorer?

c# - 无法解析此引用。找不到程序集

c# - LDAP 用户枚举不返回所有域用户

c# - Visual Studio 2015 在嵌套 using 语句中的行为

c# - 在没有新约束的情况下创建 T 的新实例

c# - 如何使用反射调用泛型类型内的非泛型方法

c# - TcpListener/TcpClient 在某些情况下停止处理数据

java - 运行包含在字符串中的一段代码

java - 使用 Proguard 后通过反射访问方法时出现 NoSuchMethodException

c# - 加载多个动态服务及其依赖服务的最佳实践