我怎么能从另一个类访问私有对象?

时间:2014-05-22 00:55:01

标签: java field

是否有一些直接或间接的方式从另一个类访问私有对象?

3 个答案:

答案 0 :(得分:3)

嗯,反思真的是你唯一的希望。它是您可以检查对象场的唯一方法,而不必过多关注其可见性修饰符。

Entity entity = new Entity();
for(Field f : entity.getClass().getDeclaredFields()) {
    try {
        f.setAccessible(true);
        System.out.println(f.get(entity));
    } catch(IllegalAccessException e) {
        e.printStackTrace();
    }
}

但是,我确实希望 强烈 警告你重置字段的可访问性。

如果您在高度并发的环境中运行,并且在完成后立即禁用了辅助功能,那么您将遇到一个案例,其中在一个线程中删除了辅助功能,因为您和#39重新读到另一个,这将导致一个巨大的,混乱的混乱。

此时,您拥有可见性修饰符这一事实变得没有实际意义,您可能只想使用零件和包裹获取器(或将字段设为public ,这让很多人觉得很奇怪。)

答案 1 :(得分:1)

通常的方法是为私有变量创建getter / setter方法。

E.g。

private String myData;

public String getMyData () {
   return myData;
}

public void setMyData (String myData) {
    this.myData = myData;
}

如果您不想这样做,那么您可以使用反射来访问私有变量。见http://docs.oracle.com/javase/tutorial/reflect/

答案 2 :(得分:-1)

您无法从其他类访问私有对象/变量。一种方法是使用getter和setter:

公共类Sample {     私有字符串名称;

//setter
public void setName(String yourname){
    this.name = yourname;
}

//getter
public String getName(){
    return name;
}

}

class AccessPrivateVariable {     public static void main(String [] args){

    Sample sample = new Sample();

    /*call the setter from Sample class and pass value
    to its parameter*/
    sample.setName("Andrew");

    /*
    access the name "Andrew" by calling getter
    */
    System.out.println("Welcome " + sample.getName());
}   

}