如何从外部类访问内部类的私有属性?

我已经在静态内部类中读到了这个概念:ViewHolder在ListView的适配器中声明为内部类,以增强getView()的性能。

考虑下面的课程

public class OuterClass{ public class InnerClass{ private int privateProperty= -2; } public static void main(String[] args) { OuterClass oc = new OuterClass(); InnerClass ic = oc.new InnerClass(); ic.privateProperty = -98; } } 

如果内部类包含私有属性,并且在外部类的方法内创建内部类的对象,则可以使用直接访问内部类私有属性。 ‘dot’运算符。

我在某处读过使用外部类的合成setter getter方法访问内部类的私有属性

我想清楚我的概念。

编译器生成访问内部类的私有成员的方法。 如果编译示例代码并检查字节码,您会发现它就像是这样编写的:

 public class OuterClass{ public class InnerClass{ private int privateProperty= -2; static int access$002(InnerClass obj, int value) { obj.privateProperty = value; return value; } } public static void main(String[] args) { OuterClass oc = new OuterClass(); InnerClass ic = oc.new InnerClass(); InnerClass.access$002(ic, -98); } } 

这种转换的路线

 ic.privateProperty = -98; 

进入方法调用:

 InnerClass.access$002(ic, -98); 

与创建静态方法一起, InnerClass.access$002由编译器完成。 静态方法(由我的编译器命名为access$002 )是您已阅读的“合成setter方法”的示例。 因此,这两个类的字节码不违反Java的访问规则。

你的概念是错误的。内部类只是在容器类中使用,这个想法来自于你不希望将不需要的类暴露给开发人员的概念,这与所有项目无关。

在这种情况下, InnerClass将仅与InnerClass相关。 在main中你应该只为InnerClass创建new,而InnerClass将创建InnerClass实例

所以它应该是这样的:

 public class OuterClass{ private InnerClass in; public Class OuterClass() { in = new InnerClass(); } //getters & setters public void setInnerProperty(int x) { in.setPrivateProperty(x); } public class InnerClass{ private int privateProperty= -2; //getters & setters } public static void main(String[] args) { OuterClass oc = new OuterClass(); oc.setInnerProperty(98); } } 

如果你想从主要改变它..这是这样做的方式,但不建议。

希望有所帮助