Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问成员类的私有成员_Java - Fatal编程技术网

Java 访问成员类的私有成员

Java 访问成员类的私有成员,java,Java,我有一个a类,有一个私有成员int myMember。还有一个B组,有一个a组的私人成员,称为myA 即: public class A{ private int myMember; ... } public class B{ private A myA; } 我希望能够访问: B.myA.myMember; 但我似乎不能,因为myMember在A中是私有的。问题是,我需要将A定义为私有的,以便进行练习(这也包括它不能被保护)。有办法解决这个问题吗 谢谢。使用ge

我有一个a类,有一个私有成员int myMember。还有一个B组,有一个a组的私人成员,称为myA

即:

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

public class B{
    private A myA;

}
我希望能够访问:

B.myA.myMember;
但我似乎不能,因为myMember在A中是私有的。问题是,我需要将A定义为私有的,以便进行练习(这也包括它不能被保护)。有办法解决这个问题吗

谢谢。

使用getter:

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();
}
}
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();

既然您已经声明不能创建更多的公共方法,也就是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
        }
    }



}

如果可以将私有字段声明为静态,则可以执行以下操作:

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);
    }
}

(1) 你为什么想要直接进入现场?(2)
A
是否是私有的无关紧要;重要的是
myMember
是私有的。你能改变吗?用吸气剂。使用反思。如果你的老师做了这个练习,那么他可能希望你使用反思。否则很简单,Private就是Private,您不能从外部访问它。请参阅相关问题:要么使用getter和setter,要么在现实世界中使用更好的解决方案,将需要myMember值的代码放入类a中的方法中。是的,我也想到了这一点。但公共职能的数量不能增加。我不知道,出了点事。谢谢你的回答。也许是默认范围?但是我不会使用反射,除非它是完全必要的,这可以用简单的getter解决。没错,但是他说他不能公开新的方法