Java 8改变了Introspection的功能 BeanInfo的getPropertyDescriptors()方法。 在Java 8运行时中,getPropertyDescriptors方法不返回索引方法。 例如,如果我们有一个具有以下签名的类Test
class Test{
public List<String> getCharges(){
return null;
}
public String getCharges(int index){
return null;
}
}
然后Java 8返回非索引(无方法参数)方法 - java.beans.PropertyDescriptor中[名称=收费; propertyType = interface java.util.List; readMethod = public java.util.List com.x.IndexPropertyTest $ Test.getCharges()]
Java 7返回索引方法(带参数) - java.beans.IndexedPropertyDescriptor中[名称=收费; indexedPropertyType = class java.lang.String; indexedReadMethod = public java.lang.String com.x.IndexPropertyTest $ Test.getCharges(int)]
因此,它会破坏任何默认情况下需要索引方法的现有客户端。为了克服遗留反射项目的这个问题,我使用了一个自定义方法来获取索引方法,然后将其返回 -
private Method isIndexMethodPresent(Class aClass, String method) {
for (Method m : aClass.getDeclaredMethods()) {
if (m.getName().equalsIgnoreCase("get"+method) && m.getParameterTypes() != null
&& m.getParameterTypes().length == 1)
for (Class p : m.getParameterTypes()) {
if ("int".equals(p.getName())) {
return m;
}
}
}
return null;
}
您能否告诉我是否有任何默认方式可以在JRE 1.8中更改此新行为。