Получите доступ к атрибуту экземпляра частного объекта в классе, используя отражение Java - PullRequest
0 голосов
/ 10 марта 2011

Я хочу получить доступ к экземпляру объекта car в классе Test из другого класса

class Test {

private car = new car(12);

}

class car {

     int i;

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

}

Ответы [ 5 ]

2 голосов
/ 10 марта 2011

Видя, что в ваших кодах есть ошибки (например, класс car должен быть Car), я бы предложил прочитать учебники, такие как , этот и , этот , о том, как получитьполя с использованием отражения.

Вот краткий пример на основе вашего комментария:

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 голос
/ 10 марта 2011

Чтобы получить доступ к закрытому атрибуту класса, вам нужно создать метод для возврата этого атрибута / поля.поэтому чтобы вернуть машину Test напишите public Car getCar () {return car;}

0 голосов
/ 26 июня 2014

Я хотел сделать это, чтобы проверить некоторые классы и найти их внутреннее состояние по умолчанию после оператора 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.

0 голосов
/ 10 марта 2011
Test test = new Test();
Field f = test.getClass().getField("car");
Object car = f.get(test);
0 голосов
/ 10 марта 2011

Для тестов, которые действительно должны иметь доступ к закрытым членам, посмотрите, можете ли вы установить для защищенных членов закрытые члены, а затем подкласс Test (или оболочку для тестирования) подкласса «быть проверенным».Тем не менее, лучше тестировать на 100% через вызовы методов.

Тестирование должно предусматривать инкапсуляцию, поэтому вы действительно хотите выйти из бизнеса, рассматривая внутренние объекты объекта.Если вы нарушите инкапсуляцию в своей среде тестирования, вы потеряете все возможные преимущества сопровождения, связанные с инкапсуляцией.Проще говоря, если вы когда-нибудь попытаетесь «исправить» свой объект, вам придется переписать все ваши тесты, чтобы соответствовать новой «фиксированной» архитектуре.

Гораздо лучше, просто протестироватьчасть Объекта, которую увидит остальной мир, которая является внешней после того, как вы прочитали / установили / обработали все, что требуется.Таким образом, если вы когда-нибудь измените внутреннюю кишку, у вас будет набор тестов, которые уже «готовы к работе», чтобы убедиться, что ваши изменения не нарушают поведение объекта, если смотреть с остального мира.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...