Почему я могу использовать отражение для вызова закрытых методов внешнего класса?

Я могу использовать отражение для доступа и вызова закрытых методов класса за пределами моей библиотеки. Это ошибка или желаемое поведение? Если это желательно, как я могу сделать невозможным доступ внешнего кода к закрытым членам/методам?

library left;

class Thing {
  void _priv(String s) {
    print(s);
  }
}

library right;

void main() {
  var t = new Thing();
  var mirror = reflect(t);

  mirror.type.declarations.values
  .where( (d) => d.isPrivate && d is MethodMirror )
  .forEach( (d) {
    print(d.simpleName == #_priv); // prints false
    mirror.getField(d.simpleName).reflectee("Hello World"); // prints Hello World
  });
}

person Upio    schedule 19.02.2015    source источник


Ответы (2)


Эта конфиденциальность не является функцией безопасности, она предназначена только для того, чтобы сообщить пользователям вашего API, что такой метод предназначен только для внутреннего использования. Доступ с использованием зеркал нельзя предотвратить.

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

person Günter Zöchbauer    schedule 19.02.2015
comment
Правильный. Блоки безопасности в Dart — это изоляторы, а не библиотеки. Один изолят не может влиять на код другого изолята без сотрудничества. Внутри изолята конфиденциальность библиотеки — это только удобство, позволяющее вам писать имена, которые не будут случайно затенены другими библиотеками. Зеркала позволяют получить доступ ко всему изолятору. - person lrn; 22.02.2015

Вызов частных методов в основном полезен при написании DSL (предметно-специфического языка).

person sri_sankl    schedule 19.02.2015
comment
Не могли бы вы уточнить немного больше. Я не понимаю вашего ответа. - person Günter Zöchbauer; 19.02.2015