【问题标题】:Why reflection works (private method call by ECMA-335)?为什么反射有效(ECMA-335 调用私有方法)?
【发布时间】:2010-11-23 02:08:00
【问题描述】:

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

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

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

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

【问题讨论】:

标签: .net reflection


【解决方案1】:

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

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

【讨论】:

  • 但我仍然看到调用和“描述如何调用”之间的巨大差异......也可以看到“访问/设置状态”和“调用方法”之间的差异要小得多"。
猜你喜欢
  • 2010-12-21
  • 2022-11-27
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
相关资源
最近更新 更多