Java-интерфейсы и реализация - PullRequest
2 голосов
/ 18 января 2012

Я использую веб-сервис, используя мое веб-приложение Java. Это возвращает количество данных, среди которых есть атрибут с именем Consumer.Это представляется как объект, когда WSDL преобразуется в код Java.Внутри этого класса есть только одна строковая переменная id.Существует еще один класс Person, который расширяет Consumer.Здесь есть числовые поля, такие как firstName, lastName и т. Д. В коде JSF есть ссылка на consumer.firstName, и значение, относящееся к firstName, печатается правильно, когда объект person возвращается как часть ответа xml.,Это немного смущает меня, потому что потребительский объект не содержит firstName, и все же значение печатается правильно, когда используется consumer.firstName.Пожалуйста, вы можете помочь мне понять это.

Код JSF

<h:outputText value="#{myBean.consumer.firstName}" />

Бэк

public Consumer getConsumer() {
  return consumer;
}

Потребительский класс

public class Consumer implements java.io.Serializable {

  private java.lang.String id;

  public java.lang.String getId() {
    return this.id;
  }

  public void setId(java.lang.String id) {
    this.id = id;
  }

}

Персональный класс

public class Person extends Consumer {
     private String firstName;
     private String lastName;
     private String dateOfBirth;

     // Getters and Setters
}

Ответы [ 3 ]

4 голосов
/ 18 января 2012

JSF использует отражение для вызова методов ваших объектов. Он не знает, что это за тип myBean.consumer. Все, что он знает, это то, что вы спросили firstName этого объекта. Итак, что он делает, это

  1. Найти атрибут в любой области с именем myBean
  2. если не ноль, найдите, если есть открытый метод без аргументов с именем "getConsumer" в классе (или любом суперклассе или интерфейсе) этого объекта
  3. Вызовите этот метод и получите результат: другой объект
  4. если этот другой объект не равен NULL, найдите, если в классе (или любом суперклассе или интерфейсе) этого другого объекта есть открытый метод no-arg с именем "getFirstName"
  5. Вызовите этот метод

Таким образом, даже если метод getConsumer() объявляет, что он возвращает Consumer, если во время выполнения фактический объект, возвращаемый getConsumer(), является Person, JSF будет искать метод getFirstName() в Person, он его найдет и с радостью позвонит и выдаст свой результат.

2 голосов
/ 18 января 2012

На странице JSF, перед тем, как вы напечатаете firstName того, что вы считаете экземпляром Consumer, также напечатайте значение «consumer.class.simpleName».Скорее всего, будет напечатано «Person», поскольку ваш объект является экземпляром «Person» (и он полиморфно рассматривается как тип Consumer, поскольку в этом случае экземпляр Person также имеет тип Consumer).

2 голосов
/ 18 января 2012

Когда в JSF вы ссылаетесь на consumer.firstName, это не тип Consumer, к которому вы обращаетесь, а атрибут вашей страницы / запроса / сессии. Этот атрибут может быть установлен как конкретный тип (Person), расширяющий Consumer, и, таким образом, он представляет значение firstName.

...