I have a simple problem. I have a program running in Java JDK7, but it does not work in JDK8 due to some changes to introspection.
Here is a test program to reproduce the problem:
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; } } }
Here are the JDK 7 logs:
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
Here are the logs for 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 have to use JDK8 very soon, but this is a lock because my application is no longer working. I have this problem with all classes extending the Collection interface (List, Map, ...)
The code is used by the commons-beanutils-1.8.0 library from Apache Commons.
I'm looking for a solution, a workaround, so that my application works the same as before when using JDK7, is there any solution? I can't use Array instead of List (because Array hasn't changed)
Here are the links to the official documentation:
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: I found my solution, my problem was with struts 1.3. I had to rename my indexed getter / setter to my ActionForm: http://www.coderanch.com/t/55172/Struts/Indexed-Properties
java java-7 java-8 introspection
Jean-romain simeoni
source share