【问题标题】:accessing private member of member class访问成员类的私有成员
【发布时间】:2013-09-09 14:02:25
【问题描述】:

我有一个 A 类,有一个私有成员 int myMember。还有一个 B 类,其中有一个 A 类的私有成员,称为 myA;

即:

public class A{
    private int myMember;
    ...
}

public class B{
    private A myA;

}

我希望能够访问:

B.myA.myMember;

但似乎我不能,因为 myMember 在 A 中是私有的。问题是,出于练习的目的,我需要将 A 定义为私有(这也包括它不能受到保护)。有没有办法解决这个问题?

谢谢。

【问题讨论】:

  • (1) 为什么要直接访问字段? (2)A是否为私有无关;重要的是myMember 是私有的。你能改变它吗?
  • 使用吸气剂。使用反射。
  • 如果你的老师已经给出了这个练习,那么他可能希望你使用反射。否则很简单, Private 是 private ,你不能从外部访问它。
  • 要么使用 getter 和 setter,或者在现实世界中可能是更好的解决方案,将需要 myMember 值的代码放入 A 类的方法中。

标签: java


【解决方案1】:
public class A {

private int myMember;

public int getMyMember() {
    return myMember;
}

public void setMyMember(int myMember) {
    this.myMember = myMember;
}

}


public class B{

private A myA;

public B() {
    myA = new A();
    myA.setMyMember(0);
    int a = myA.getMyMember();
}
}

【讨论】:

    【解决方案2】:

    使用吸气剂:

    public class A {
        private int myMember;
        public getMyNumber() {
            return myNumber;
        }
    }
    
    public class B {
        private A myA;
        public A getA() {
            return myA;
        }
    }
    

    所以现在你可以编码了:

    B b = new B(); 
    b.getA().getMyMember();
    

    【讨论】:

    • 是的,我也想过。但公共职能的数量不得增加。不知道,有事谢谢你的回答。
    • 也许是默认范围?比它可以在包中使用,你还有一个吸气剂。
    【解决方案3】:

    既然你说你不能创建更多的公共方法,也就是 getter,你可以使用反射......

    public class A{
        private int myMember;
        ...
    }
    
    public class B{
        private A myA;
    
        private int get(){
            try {
                 Field field = myA.getClass().getDeclaredField("myMember");
                 field.setAccessible(true);
                 return (int) field.get(myA);
            catch (Exception e){
                 //Something went wrong, the field doesn't exist or a security exception
                 return null; //or return some "error number" like -10
            }
        }
    
    
    
    }
    

    【讨论】:

    • RIP 隐私,但我不会使用反射,除非它完全不需要,这可以通过简单的 getter 来解决。
    • 没错,但是他说他不能创建新的公共方法
    【解决方案4】:

    如果您可以将 私有字段 声明为 static,那么这样的事情是可能的:

    public class A {
        private int myMember;
    }
    
    public class B {
        public static void main (String[] args) {
            int myMember = new A() {
                public int getPrivate() {
                    return myMember;
                }
            }.getPrivate();
            System.out.print("\n\t Id : " + myMember);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 2015-11-15
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多