这个问题看起来有些奇怪,但我们在检索JavaBean的PropertyDescriptor时遇到了一种奇怪的行为。以下是使用1.6、1.7和1.8编译的简单代码的执行结果。
Java 1.6 执行结果:
java.beans.PropertyDescriptor@4ddc1428 <- 不重要 java.beans.IndexedPropertyDescriptor@7174807e <- 是的,我有一个索引属性 Java 1.7 执行结果:
java.beans.PropertyDescriptor[name=class; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()] <- 不重要 java.beans.IndexedPropertyDescriptor[name=values; indexedPropertyType=class java.lang.String; indexedReadMethod=public java.lang.String JavaBean.getValues(int)] <- 是的,我有一个索引属性 Java 1.8 执行结果:
java.beans.PropertyDescriptor[name=class; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()] <- 不重要 java.beans.PropertyDescriptor[name=values; propertyType=interface java.util.List; readMethod=public java.util.List JavaBean.getValues()] <- 啊!这不再是一个索引属性了! 为什么会发生变化?
JavaBean规范规定访问具有索引的属性时,并没有强制要求使用数组作为索引属性的容器。我错了吗?
我读了规范,第8.3.3章谈到了索引属性的设计模式,而不是严格规则。
如何使以前的行为重新出现而不需要重构整个应用程序?< 旧应用程序,需要修改很多代码等等...
谢谢回答,
JavaBean类
Java 1.6 执行结果:
java.beans.PropertyDescriptor@4ddc1428 <- 不重要 java.beans.IndexedPropertyDescriptor@7174807e <- 是的,我有一个索引属性 Java 1.7 执行结果:
java.beans.PropertyDescriptor[name=class; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()] <- 不重要 java.beans.IndexedPropertyDescriptor[name=values; indexedPropertyType=class java.lang.String; indexedReadMethod=public java.lang.String JavaBean.getValues(int)] <- 是的,我有一个索引属性 Java 1.8 执行结果:
java.beans.PropertyDescriptor[name=class; propertyType=class java.lang.Class; readMethod=public final native java.lang.Class java.lang.Object.getClass()] <- 不重要 java.beans.PropertyDescriptor[name=values; propertyType=interface java.util.List; readMethod=public java.util.List JavaBean.getValues()] <- 啊!这不再是一个索引属性了! 为什么会发生变化?
JavaBean规范规定访问具有索引的属性时,并没有强制要求使用数组作为索引属性的容器。我错了吗?
我读了规范,第8.3.3章谈到了索引属性的设计模式,而不是严格规则。
如何使以前的行为重新出现而不需要重构整个应用程序?< 旧应用程序,需要修改很多代码等等...
谢谢回答,
JavaBean类
import java.util.ArrayList;
import java.util.List;
public class JavaBean {
private List<String> values = new ArrayList<String>();
public String getValues(int index) {
return this.values.get(index);
}
public List<String> getValues() {
return this.values;
}
}
主类
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class Test {
public static void main(String[] args) throws IntrospectionException {
PropertyDescriptor[] descs =
Introspector.getBeanInfo(JavaBean.class).getPropertyDescriptors();
for (PropertyDescriptor pd : descs) {
System.out.println(pd);
}
}
}