在java反射中将Field.get()返回的Object转换为String []

时间:2013-09-13 15:19:20

标签: java reflection field

我有一个泛型类,它维护一个内部数组(比方说数据)和数组中的元素数(比如N)(两者都是私有的)。我可以向数组添加元素,这将更新N的值。该类的公共API没有数据数组的获取方法或N.Still我想编写用于检查数组状态和N的单元测试。

    public class InternalArray<T> {
    private T[] data;
    private int N;
    private int head;
    public InternalArray() {
        super();
        data = (T[]) new Object[10];
        N = 0;
        head = 0;
    }

    public void add(T item){
        data[head]=item;
        head++;
        N++;
    }

    public T get(){
        T item = data[--head];
        N--;
        return item;
    }
}

在这里,我可以测试的是公共API ..但我需要测试私有变量的内部状态。我以为我可以使用反射来访问这些字段。我尝试了下面的代码,我可以得到N的值。当谈到T []数据时,我无法弄清楚如何转换结果{{1转到Object(来自电话String[]

arrayf.get(inst)

这给出了

以下的输出
public static void demoReflect(){
        try {           
                Class t = Class.forName("InternalArray");
                System.out.println("got class="+t.getName());
                InternalArray<String> inst = (InternalArray<String>) t.newInstance();
                System.out.println("got instance="+inst.toString());

                inst.add("A");
                inst.add("B");
                Field arrayf = t.getDeclaredField("data");
                arrayf.setAccessible(true);
                Field nf = t.getDeclaredField("N");
                nf.setAccessible(true);
                System.out.println("got arrayfield="+arrayf.getName());
                System.out.println("got int field="+nf.getName());
                int nval = nf.getInt(inst);
                System.out.println("value of N="+nval);
                Object exp = arrayf.get(inst);
                //how to convert this to String[] to compare if this is {"A","B"}

        } catch (ClassNotFoundException e) {            
            e.printStackTrace();
        } catch (InstantiationException e) {            
            e.printStackTrace();
        } catch (IllegalAccessException e) {            
            e.printStackTrace();
        } catch (SecurityException e) {         
            e.printStackTrace();
        } 
        catch (IllegalArgumentException e) {            
            e.printStackTrace();
        } catch (NoSuchFieldException e) {          
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:2)

Object调用得到的arrayf.get(inst)类型为Object[],而不是String[],因为Java泛型是通过type erasure实现的。你可以这样做:

Object[] strings = (Object[])arrayf.get(inst);
System.out.println(strings.length);
for (int i = 0 ; i != strings.length ; i++) {
    String s = (String)strings[i];
    ...
}

P.S。我将远离关于是否对单元测试实现的私有细节进行单元测试的讨论。