考虑这个例子: import java.lang.reflect.Field; public class Test { public static void main(String[] args) { C c = new C(); try { Field f = C.class.getDeclaredField("a"); f.setAccessible(true); Integer i = (Integer)f.get(c); System.out.println(i); } catch (Exception e) {} } } class C { private Integer a =6; } 你被允许通过反思访问私人领域的课程似乎是不合逻辑的。 为什么这样的function可用? 允许这种访问不是“危险的”吗?
在C#(以及许多其他语言)中,访问相同types的其他实例的私有字段是完全合法的。 例如: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if(anotherFoo.aBool) … } } 由于C#规范 (3.5.1节,3.5.2节)规定私有字段的访问是一种types,而不是一个实例。 我一直在和一位同事讨论这个问题,我们试图想出一个这样的原因(而不是限制对同一个实例的访问)。 我们可以提出的最好的论点是平等检查,其中类可能想访问私人领域,以确定与另一个实例的平等。 还有其他的原因吗? 或者一些绝对意味着它必须这样或那样的工作的黄金理由是完全不可能的?
有没有办法让“私有”变量(在构造函数中定义的),可用于原型定义的方法? TestClass = function(){ var privateField = "hello"; this.nonProtoHello = function(){alert(privateField)}; }; TestClass.prototype.prototypeHello = function(){alert(privateField)}; 这工作: t.nonProtoHello() 但是这不是: t.prototypeHello() 我习惯于在构造函数中定义我的方法,但由于几个原因,我正在远离它。