Java接口和实现

时间:2012-01-18 12:07:16

标签: java web-services jsf el

我正在使用我的java web应用程序来使用web服务。这会返回一些数据,其中有一个名为Consumer的属性。当WSDL转换为Java代码时,这表示为对象。此类中只有一个字符串变量id。还有另一个类Person,它扩展了Consumer。这有一些数字字段,如firstNamelastName等。在JSF代码中,有consumer.firstName的引用,并且当人员正确打印与firstName相关的值时object作为响应xml的一部分返回。这让我感到困惑,因为消费者对象不包含firstName,并且在使用consumer.firstName时仍然可以正确打印该值。请你帮我理解一下。

JSF代码

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

支持Bean

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 个答案:

答案 0 :(得分:4)

JSF使用反射来调用对象上的方法。它不知道myBean.consumer的类型是什么。它只知道你问过这个对象的firstName。那么,它的作用是什么

  1. 在任何范围内查找名为myBean
  2. 的属性
  3. 如果不为null,查找该对象的类(或任何超类或接口)中是否存在名为“getConsumer”的公共no-arg方法
  4. 调用此方法,并获得结果:另一个对象
  5. 如果此其他对象不为null,则查找该另一个对象的类(或任何超类或接口)中是否存在名为“getFirstName”的公共无参数方法
  6. 调用此方法
  7. 因此,即使方法getConsumer()声明它返回Consumer,如果在运行时,getConsumer()返回的实际对象是Person,JSF将在getFirstName()中搜索Person方法,它会找到它,并乐意调用它并输出结果。

答案 1 :(得分:2)

在JSF时,您引用的是consumer.firstName,它不是您要访问的类型Consumer,而是您的页面/请求/会话的属性。 此属性可以设置为扩展Person的具体类型(Consumer),因此它会显示firstName值。

答案 2 :(得分:2)

在您的JSF页面中,在您打印出您认为是Consumer实例的firstName之前,还会打印“consumer.class.simpleName”的值。很可能这将打印“Person”,因为您的对象是“Person”的实例(并且它被多态地视为Consumer类型,因为在这种情况下,Person实例也是Consumer类型。)