Ich habe ein einfaches Problem. Ich habe ein Programm, das in Java JDK7 arbeitet, aber es funktioniert nicht in JDK8 wegen einiger Introspektionsänderungen.Java JDK 8 IndexedPropertyDescriptor hat sich seit JDK 7 mit List-Objekt geändert
Hier ein Testprogramm ist es, das Problem zu reproduzieren:
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws IntrospectionException {
BeanInfo info = Introspector.getBeanInfo(MyListClass.class);
PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
for (int i = 0; i < descriptors.length; i++) {
System.out.println(descriptors[i].getClass().getName() + ":" + descriptors[i].getName());
}
System.out.println("\n");
BeanInfo info2 = Introspector.getBeanInfo(MyIndexedListClass.class);
PropertyDescriptor[] descriptors2 = info2.getPropertyDescriptors();
for (int i = 0; i < descriptors2.length; i++) {
System.out.println(descriptors2[i].getClass().getName() + ":" + descriptors2[i].getName());
}
System.out.println("\n");
BeanInfo info3 = Introspector.getBeanInfo(MyArrayClass.class);
PropertyDescriptor[] descriptors3 = info3.getPropertyDescriptors();
for (int i = 0; i < descriptors3.length; i++) {
System.out.println(descriptors3[i].getClass().getName() + ":" + descriptors3[i].getName());
}
System.out.println("\n");
BeanInfo info4 = Introspector.getBeanInfo(MyIndexedArrayClass.class);
PropertyDescriptor[] descriptors4 = info4.getPropertyDescriptors();
for (int i = 0; i < descriptors4.length; i++) {
System.out.println(descriptors4[i].getClass().getName() + ":" + descriptors4[i].getName());
}
}
public class MyListClass {
private List<String> myListClass = new ArrayList<String>();
public List<String> getMyListClass() {
return myListClass;
}
public void setMyListClass(List<String> myListClass) {
this.myListClass = myListClass;
}
}
public class MyIndexedListClass {
private List<String> myIndexedListClass = new ArrayList<String>();
public String getMyIndexedListClass(int index) {
return myIndexedListClass.get(index);
}
public void setMyIndexedListClass(int index, String element) {
this.myIndexedListClass.set(index, element);
}
public List<String> getMyIndexedListClass() {
return myIndexedListClass;
}
public void setMyIndexedListClass(List<String> myIndexedListClass) {
this.myIndexedListClass = myIndexedListClass;
}
}
public class MyArrayClass {
private String[] myArrayClass = new String[20];
public String[] getMyArrayClass() {
return myArrayClass;
}
public void setMyArrayClass(String[] myArrayClass) {
this.myArrayClass = myArrayClass;
}
}
public class MyIndexedArrayClass {
private String[] myIndexedArrayClass = new String[20];
public String getMyIndexedArrayClass(int index) {
return myIndexedArrayClass[index];
}
public void setMyIndexedArrayClass(int index, String myValue) {
this.myIndexedArrayClass[index] = myValue;
}
public String[] getMyIndexedArrayClass() {
return myIndexedArrayClass;
}
public void setMyIndexedArrayClass(String[] myIndexedArrayClass) {
this.myIndexedArrayClass = myIndexedArrayClass;
}
}
}
Hier werden die JDK 7-Protokolle sind:
java.beans.PropertyDescriptor:class
java.beans.PropertyDescriptor:myListClass
java.beans.PropertyDescriptor:class
java.beans.IndexedPropertyDescriptor:myIndexedListClass
java.beans.PropertyDescriptor:class
java.beans.PropertyDescriptor:myArrayClass
java.beans.PropertyDescriptor:class
java.beans.IndexedPropertyDescriptor:myIndexedArrayClass
Hier sind die Protokolle für JDK8:
java.beans.PropertyDescriptor:class
java.beans.PropertyDescriptor:myListClass
java.beans.PropertyDescriptor:class
java.beans.PropertyDescriptor:myIndexedListClass -> Here is the change
java.beans.PropertyDescriptor:class
java.beans.PropertyDescriptor:myArrayClass
java.beans.PropertyDescriptor:class
java.beans.IndexedPropertyDescriptor:myIndexedArrayClass
I Ich muss das JDK8 wirklich bald benutzen, aber das ist eine blockierende Änderung, weil meine App nicht mehr funktioniert. Ich habe dieses Problem mit allen Klassen, die die Collection
Schnittstelle erweitern (Liste, Karte, ...)
Der Code wird von der Bibliothek commons-beanutils-1.8.0
von Apache Commons verwendet.
Ich suche nach einer Lösung, eine Workaround, um meine Anwendung auf die gleiche Weise wie zuvor zu arbeiten, wenn Sie das JDK7 verwenden, gibt es eine Lösung? Ich kann nicht Array statt Liste verwenden (da Array nicht geändert hat)
Hier sind die Links zu der offiziellen Dokumentation:
JDK7: http://docs.oracle.com/javase/7/docs/api/java/beans/IndexedPropertyDescriptor.html
JDK8: http://docs.oracle.com/javase/8/docs/api/java/beans/IndexedPropertyDescriptor.html
EDIT: Ich fand meine Lösung, mein Problem war mit Streben 1.3 verwandt. Ich musste meine indizierte Getter/Setter in meiner Action umbenennen: http://www.coderanch.com/t/55172/Struts/Indexed-Properties
Ich sehe keinen Unterschied in Ihren Beispielen. Was genau ist das Problem? –
In JDK 7 gibt die Methode getPropertyDescritor von BeanInfo 'IndexedPropertyDescriptor' für die Klasse MyIndexedListClass zurück und gibt in JDK 8 einen 'PropertyDescriptor' zurück. –