Почему рефлексия работает (закрытый вызов метода ECMA-335)? - PullRequest
3 голосов
/ 23 ноября 2010

Вопрос возникает с двумя фактами: 1) При размышлении можно вызвать приватный метод.2) TypeBuilder не может создать новый тип «унаследованного» внутреннего типа формы из другой сборки.

Я могу объяснить поведение TypeBuilder с помощью ECMA-335 - если тип не «помечен как экспортированный», он невидим, требуется наследованиеvisibility.

Но я не могу объяснить, почему работает отражение?

Спецификация ECMA узаконивает доступ к метаданным во время выполнения с помощью Reflection, и упоминается одно приложение - сериализация, которая означает доступ к состоянию., к полям. Есть также предложение «метаданные описывают, как разрешить вызов», но я не могу найти в тексте случаев, когда доступность метода может быть проигнорирована при разрешении вызова.Возможно, я что-то пропустил.Может ли кто-нибудь объяснить мне, как авторы ECMA оставили дверь открытой для вызовов частных методов (по крайней мере, для размышления, кстати, есть фраза «доступ к членам можно игнорировать, если это специально указано» - но я не могу найти эти случаи втекст, опять же)?

1 Ответ

2 голосов
/ 23 ноября 2010

Здесь только предположение, но статический анализ таких вещей, как проверка безопасности типов и достоверности управляемого кода, требует рассмотрения всех частей типа класса - как открытого интерфейса, так и частных полей. Если класс содержит закрытое поле небезопасного типа, безопасность типа самого класса находится под вопросом.

Если бы закрытые члены не были видны в API отражений, статический анализ безопасности типов был бы невозможен или был бы крайне неполным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...