Dart 为什么我可以使用反射来调用外部类的私有方法?

Dart 为什么我可以使用反射来调用外部类的私有方法?,dart,dart-mirrors,Dart,Dart Mirrors,我可以使用反射来访问和调用库外类的私有方法。这是错误还是期望的行为?如果需要,如何使外部代码无法访问私有成员/方法 库左; 阶级事务{ void _priv(字符串s){ 印刷品; } } 图书馆权; void main(){ var t=新事物(); var镜像=反射(t); mirror.type.declarations.values 。其中((d)=>d.isPrivate&&d是MethodMirror) .forEach((d){ print(d.simpleName=##_priv

我可以使用反射来访问和调用库外类的私有方法。这是错误还是期望的行为?如果需要,如何使外部代码无法访问私有成员/方法

库左;
阶级事务{
void _priv(字符串s){
印刷品;
}
}
图书馆权;
void main(){
var t=新事物();
var镜像=反射(t);
mirror.type.declarations.values
。其中((d)=>d.isPrivate&&d是MethodMirror)
.forEach((d){
print(d.simpleName=##_priv);//prints false
mirror.getField(d.simpleName).reflectee(“helloworld”);//打印helloworld
});
}

此隐私不是一项安全功能,只是为了向API用户传达此类方法仅供内部使用。无法阻止使用镜像进行访问


在镜像中不允许它不会阻止访问,因为VM和dart2js只是篡改或前缀私有方法名称,以防止名称与公共方法冲突。这些名字可以用蛮力预测或找到,然后被调用

调用私有方法在编写DSL(域特定语言)时非常有用。

请您详细说明一下。我不明白你的答案。正确。Dart中的安全单元是隔离的,而不是库。没有合作,一个隔离不能影响另一个隔离中的代码。在隔离库中,库隐私只是为了方便您编写不会被其他库意外遮挡的名称。镜像允许访问整个系统。