我正在使用我的java web应用程序来使用web服务。这会返回一些数据,其中有一个名为Consumer
的属性。当WSDL转换为Java代码时,这表示为对象。此类中只有一个字符串变量id
。还有另一个类Person
,它扩展了Consumer
。这有一些数字字段,如firstName
,lastName
等。在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
}
答案 0 :(得分:4)
JSF使用反射来调用对象上的方法。它不知道myBean.consumer
的类型是什么。它只知道你问过这个对象的firstName
。那么,它的作用是什么
因此,即使方法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类型。)