如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?

Posted

技术标签:

【中文标题】如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?【英文标题】:What's the point of having private constructors if you can access them with reflection?如果您可以通过反射访问它们,那么拥有私有构造函数有什么意义? 【发布时间】:2011-05-10 00:45:44 【问题描述】:

可能还有私有静态方法和属性等

【问题讨论】:

【参考方案1】:

访问修饰符有助于指导程序流程。它们就像交通信号灯——你不必服从它们,在某些情况下,授权玩家可能会选择忽略它们,但你通常希望尊重它们,因为它们让一切运行得更加顺畅。

【讨论】:

【参考方案2】:

私有构造函数通常与设计模式(例如Factory Method Pattern、Singleton Pattern)一起使用,以防止对象被错误地实例化。

如果您不需要访问任何实例变量(编译器不必检查对象是否为非空),私有静态方法通常调用速度更快。

【讨论】:

【参考方案3】:

反射被认为是一种比通常更强大的访问类的方法 - 建议对不受控制的代码拒绝非公共访问 - 请参阅 ReflectionPermission。

没有 ReflectionPermission,代码可以 使用反射仅访问 对象的公共成员。代码与 ReflectionPermission 和 适当的 ReflectionPermissionFlag 标志可以访问受保护和 对象的私有成员。

注意

因为反射权限 可以提供对非公共类型的访问 和会员,我们建议您这样做 不授予 ReflectionPermission 给 互联网代码,除了 ReflectionPermissionFlag.RestrictedMemberAccess 旗帜。 RestrictedMemberAccess 允许 访问非公共成员,与 的授予集的限制 非公共成员必须等于, 或其子集的授权集 访问非公开的代码 成员。

换句话说,人们只有在你允许的情况下才能访问你的类内部 - 就像首先设置访问修饰符一样,对于具有程序集引用的直接客户端。任何成员只有在您让其可见时才可见。

【讨论】:

【参考方案4】:

此行为在 Silverlight 运行时中有所不同,基本上反射只能执行编译器(C# 或 VB)允许执行的操作。 因此,在 Silverlight 中,您不能使用私有构造函数进行实例化,即使使用 Activator.CreateInstance。

【讨论】:

以上是关于如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

反射那些事

如果可以通过反射绕过访问修饰符,它们的目的是啥?

如何通过反射访问私有方法和私有数据成员?

在没有 getter 或反射的情况下访问依赖字段 [重复]

使用反射从抽象基类访问构造函数

带参数的Java私有构造函数[重复]