Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单例静态嵌套类的反射get字段_Java_Reflection - Fatal编程技术网

Java 单例静态嵌套类的反射get字段

Java 单例静态嵌套类的反射get字段,java,reflection,Java,Reflection,我有以下课程: public class A { private static class B { private static final B instance = new B(); private ArrayMap<String, Integer> map; } } 公共A类{ 专用静态B类{ 私有静态最终B实例=新B(); 私有数组映射; } } 我正在尝试使用反射来获取地图字段,但我不明白 怎么办。我目前的代码是:

我有以下课程:

public class A {
    private static class B {
        private static final B instance = new B();
        private ArrayMap<String, Integer> map;
    }
}
公共A类{
专用静态B类{
私有静态最终B实例=新B();
私有数组映射;
}
}
我正在尝试使用反射来获取地图字段,但我不明白 怎么办。我目前的代码是:

    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();
            }
        }
    }
Class[]classes=ainstance.getClass().getDeclaredClasses();
用于(c类:类){
if(c.getName().equals(“com.foo.A$B”)){
试一试{
字段f=c.getDeclaredField(“实例”);
f、 setAccessible(true);
字段f1=c.getDeclaredField(“地图”);
f1.设置可访问(真);
阵列地图;
试一试{
map=(ArrayMap)f1.get(f.getType());
System.out.println(map.get(“id”);
}捕获(非法访问例外e){
e、 printStackTrace();
}
}捕获(无此字段例外){
e、 printStackTrace();
}
}
}
之后

            Field f = c.getDeclaredField("instance");
            f.setAccessible(true);
需要获取
实例
对象:

            Object instance = f.get(null); // null as static, no 'this'.
map也一样,现在不是null,而是
实例

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

可以删除泛型类型参数。

什么不起作用?您应该有足够的时间来理解如何编写“代码不工作”问题。
f1.get(f.getType())
->
f1.get(f.get(null))
?没有stacktrace,很难知道出了什么问题。
f.getType()
没有多大意义。它应该是
f.getValue(null)
“静态内部”在术语上是矛盾的。@EJP它不是我的代码,所以我不能做任何事情
map=(ArrayMap)f1.get(f.getType())似乎有点可疑…但很难说这段代码应该做什么。非常感谢,它成功了。