该private
改性剂是用来限制在类的外部访问,但使用反射其他类可以访问私有方法和字段。因此,我想知道如果它是需求的一部分,我们如何才能限制可访问性。
该private
改性剂是用来限制在类的外部访问,但使用反射其他类可以访问私有方法和字段。因此,我想知道如果它是需求的一部分,我们如何才能限制可访问性。
Answers:
访问修饰符的目的是通知开发人员有关类的公共接口是什么的代码。它们绝不是安全措施,并且从字面上看也不会隐藏或保护任何信息。
“这里的问题是防止墨菲与防止马基雅维利……也就是说,防止意外误用(该语言很好用)与防止故意滥用(实际上是不可能的)。最后,如果程序员非常想破坏系统,他会找到办法”
#define private public
(忽略它实际上是未定义行为),瞧,我可以从外部完全访问类的受限部分。
在Python中,没有访问修饰符。约定是在下划线前面加上不应从类外部访问的方法和变量。从技术上讲,它是否阻止您从第三方类访问此类字段?一点也不; 但是,如果您这样做了,那您就自己一个人了,并且冒着破坏某件事的风险,而不能责怪其他人。
在C#中,存在访问修饰符,但它们仅是一种约定-由编译器强制执行的约定,但仍是约定。这意味着从技术上讲,仍然可以通过反射或直接篡改内存来访问和更改私有变量(就像游戏培训师一样)。结果是完全一样的:如果通过另一个类的Reflection更改了类的变量,或者通过另一个应用程序的内存篡改更改了类的变量,但它破坏了类中的某些内容,那不是您的错。
请注意,这显然会带来安全问题,第三方可以访问您的数据。这会导致字符串和类似数据结构的加密变体。但是,保护您的代码免于这种使用是与操作系统和代码级访问限制相关的更多内容,并且与反射本身无关。