【问题标题】:How could I access a private object from another class?如何从另一个类访问私有对象?
【发布时间】:2014-05-22 00:55:01
【问题描述】:

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

【问题讨论】:

  • 反思是唯一的方法。
  • 如果你试图从另一个类访问私有对象,那你做错了......
  • @SotiriosDelimanolis - 实际上,您也可以使用本机方法。
  • @HotLicks 本机方法不受访问修饰符的限制吗? (我从未开发过原生方法。)
  • 但我确定使用反射可能比使用本机方法更快?除非当然有比反射更快的原生方法,请告诉我!

标签: java field


【解决方案1】:

好吧,反思确实是您对这一点的唯一希望。这将是您无需过多关注其可见性修饰符即可检查对象的字段的唯一方法。

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

但是,我确实想强烈警告您重置该字段的可访问性。

如果您在高并发环境中运行,并且在完成后立即禁用可访问性,您将遇到在一个线程中删除可访问性的情况,因为您将要阅读它在另一个,这将导致一个巨大的混乱混乱。

此时,您拥有可见性修饰符的事实变得毫无意义,您可能只想使用部分和包裹的getter(或者将字段设为public,这让很多人感到奇怪)。

【讨论】:

  • 如果您查看 Initializer.java 第 100 - 103 行,这或多或少就是我所做的。但是我也可以设置该值吗?
  • 是的,get() 类附加了一个 get() 方法。此外,您真的不应该将那些 Fields 转换为 Object,因为这意味着您必须进行不必要的转换才能让它们恢复原状。
  • 每个线程都有自己的方法本地 Field 实例,所以这里不存在并发问题(当然,除非你使用 Field 来改变实体的状态)。
【解决方案2】:

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

例如

private String myData;

public String getMyData () {
   return myData;
}

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

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

【讨论】:

  • 也许我应该在完成之前突出显示全自动;我明确声明对象的类应该与这个类没有关系,除了创建它的新对象,并且只由程序的主类真正使用。感谢您的教程,尽管反思:)
  • 全自动是什么意思?我以前没有遇到过这个编程术语。
  • 好吧,您可以推断并且正确,因为该对象除了创建一个新对象之外应该与此类没有关系,那么您为什么要创建一个 getter 和 setter,因为它会为您更改它们并且它们可能是私有对象,除了初始化它的对象以及声明它的类之外,不会被任何东西改变。
  • 你可以考虑使用 aspectJ
【解决方案3】:

您不能从另一个类访问私有对象/变量。一种方法是使用 getter 和 setter:

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

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

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

}

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

}

【讨论】:

  • 不。人,反射可以访问私有方法,但我不知道如何!那将是有用的。每个人都说这是不可能的,无论如何我通常不会这样做,除非哦,说目的是调试一个类并初始化任何空对象!?是的......这就是原因...
  • LinkTheProgrammer 我给了你一个教程链接,@Makoto sensei 给了你一些示例代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2017-03-08
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多