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版本中发生的。

⚠️ **GitHub.com Fallback** ⚠️