反射获取单例静态嵌套类的字段

时间:2016-08-15 08:37:17

标签: java reflection

我有以下课程:

public class A {
    private static class B {
        private static final B instance = new B();
        private ArrayMap<String, Integer> map;
    }
}

我正在尝试使用反射来获取地图字段,但我不明白 该怎么办。我目前的代码是:

    Class<?>[] classes = ainstance.getClass().getDeclaredClasses();
    for (Class c : classes) {
        if (c.getName().equals("com.foo.A$B")) {
            try {
                Field f = c.getDeclaredField("instance");
                f.setAccessible(true);
                Field f1 = c.getDeclaredField("map");
                f1.setAccessible(true);
                ArrayMap<String, Integer> map;
                try {
                    map = (ArrayMap<String, Integer>) f1.get(f.getType());
                    System.out.println(map.get("id"));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

            Field f = c.getDeclaredField("instance");
            f.setAccessible(true);

需要获取instance对象:

            Object instance = f.get(null); // null as static, no 'this'.

然后地图相同,现在不是null,而是instance

                map = (ArrayMap<String, Integer>) f1.get(instance);

可以删除泛型类型参数。