Java6和Java8中反射处理的一个区别 - xbwen/xbwen.github.io GitHub Wiki
在将公司项目从Java6升级到Java8的时候,遇到了一个坑,这里记录一下。
按理说,Java8应该是向下兼容Java6的。但事情没有想象中那么完美。在对一些反射做处理的时候,还是有区别的。
首先,定义一个MyObject类,如下:
/*
* Copyright (c) www.bugull.com
*/
package com.xbwen.reflect;
import java.util.Map;
/**
*
* @author Frank Wen([email protected])
*/
public class MyObject {
private Map<String, Integer[]> map;
public Map<String, Integer[]> getMap() {
return map;
}
public void setMap(Map<String, Integer[]> map) {
this.map = map;
}
}
然后,写一个JUnit单元测试。
/*
* Copyright (c) www.bugull.com
*/
package com.xbwen.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.junit.Test;
/**
*
* @author Frank Wen([email protected])
*/
public class ReflectTest {
@Test
public void test() throws Exception {
Field f = MyObject.class.getDeclaredField("map");
ParameterizedType paramType = (ParameterizedType)f.getGenericType();
Type[] types = paramType.getActualTypeArguments();
if(types[1] instanceof GenericArrayType){
System.out.println("array:true");
}else{
System.out.println("array:false");
}
System.out.println(types[1]);
}
}
在Java6中执行,结果如下:
array:true
java.lang.Integer[]
在Java8中执行,结果如下:
array:false
class [Ljava.lang.Integer;
可见,对于Map<K,V[]>这样数据的反射类型处理,Java6和Java8是不一样的。至于解决办法,可以参考bugu-mongo中相关的源代码。
注:我们直接从Java6升级到了Java8,没有使用Java7,因此不确定这个变化是在Java7还是Java8版本中发生的。