使用java反射访问类中的私有对象实例属性

时间:2011-03-09 22:35:34

标签: java reflection java-ee

我想从另一个类

访问Test类中的car对象实例
class Test {

private car = new car(12);

}

class car {

     int i;

  car(int i) {
      this.i = i;
  }

}

5 个答案:

答案 0 :(得分:2)

看到您的代码有错误(例如,课程car必须为Car),我建议您阅读this onethis one等教程,了解如何使用反射。

以下是基于您的评论的简短示例:

public class Test{

private car = new car(12); 

    public Test() {
        Fields[] fields = this.getClass().getDeclaredFields();
        if (fields != null) {
            for (Field field: fields) {
                Class<?> fieldType = field.getType();
                System.out.println(fieldType.getName());

                if (Car.class == fieldType) {
                    System.out.println("Field: " + field.getName() + " is of type " + Car.class.getName());
                }
            }
        }
    }
}

答案 1 :(得分:1)

要访问类的私有属性,您需要创建一个返回该属性/字段的方法。所以返回Test写的车 public Car getCar(){     回车; }

答案 2 :(得分:0)

对于真正必须访问私有成员的测试,看看是否可以将私有成员设置为protected,然后让Test(或测试包装器)子类成为“待测试”对象。也就是说,最好通过方法调用来测试100%。

测试应该允许封装,所以你真的想要放弃查看对象内部的业务。如果您破坏了测试框架中的封装,则会失去封装所带来的所有可维护性优势。简而言之,如果您尝试“修复”您的对象,则必须重写所有测试以符合新的“固定”架构。

仅仅测试世界其他地方将会看到的对象部分远远好得多,这是在您阅读/设置/处理所需内容之后的外部。这样,如果您更改了内部内容,您将拥有一套已经“准备就绪”的测试,以验证您的更改并未破坏从世界其他地方看到的对象的行为。

答案 3 :(得分:0)

Test test = new Test();
Field f = test.getClass().getField("car");
Object car = f.get(test);

答案 4 :(得分:0)

我想这样做来检查一些类,并在 new 运算符后找到它们的默认内部状态。无论如何,我在本教程中找到了答案:

整个教程系列很有用。如果你赶时间,我已经粘贴了有趣的位:

 PrivateObject privateObject = new PrivateObject("The Private Value");

 Field privateStringField = PrivateObject.class.
             getDeclaredField("privateString");

 privateStringField.setAccessible(true);

 String fieldValue = (String) privateStringField.get(privateObject);
 System.out.println("fieldValue = " + fieldValue);

非常简单。一旦找到有时间解释的人。感谢stackoverflow。