Java初学者;使用反射可以访问私有字段(不问如何访问,参见问题1和问题2)。
我的问题与此行为的性质有关。
- 是否存在任何限制?我能访问遇到的任何
.class
的任何字段吗? - 在我的代码中,一旦将字段的可见性设置为例如"public",它会永久改变还是仅在上下文结构(方法, if, for…)结束之前有效?请查看以下代码
- 对所有人来说这样做是否安全?我的意思是,StackOverflow的高级程序员们,这是否是一种安全漏洞?
代码 [已编辑]:
Field f = obj.getClass().getDeclaredField("field");
if (...) {
f.setAccessible(true);
// f IS accesible
}
// is f accesible?
Singleton
类的私有构造函数来创建多个实例。 - Chetan Kingerf.setAccessible(true)
,那么您正在授予对该特定Field
实例所表示的字段的访问权限。如果您创建另一个实例的Field
指向同一字段(无论之前是否对先前的Field
实例调用了setAccessible(true)
),则此新实例将无法访问私有字段。在您的代码中,如果设置字段的可见性为 "public",则与setAccessible(true)
不同,它将永久地公开该字段而不仅仅是在特定实例上。 - PshemoSingleton
示例的情况下,可以通过在构造函数中抛出异常来实现,如果指向类实例的自引用不为null。当使用反射的调用者收到此异常时,应推断该类是单例,并寻找其他获取类实例句柄的方法。 - Chetan Kinger