Java 使用反射访问私有内部类字段

Java 使用反射访问私有内部类字段,java,reflection,Java,Reflection,我想知道如何在JUnit测试中使用反射来访问私有内部类的私有字段 以下是我需要的一个示例: public class A { private Map<Integer, InnerClass> objectMap = new TreeMap<Integer, InnerClass>.descendingMap(); private class InnerClass { private int fieldOne

我想知道如何在JUnit测试中使用反射来访问私有内部类的私有字段

以下是我需要的一个示例:

public class A
{
    private Map<Integer, InnerClass> objectMap = new TreeMap<Integer, InnerClass>.descendingMap();

    private class InnerClass    
    {
        private int fieldOne
        private int fieldTwo
    }
}
公共A类
{
private Map objectMap=new TreeMap.downingMap();
私有类内部类
{
私人int fieldOne
二等兵
}
}
在本例中,我希望访问实例A中的fieldOne和fieldTwo的值

我尝试了以下方法:

A instanceA = new A(); 

Field privateObjectMapField = A.class.getDeclaredField("objectMap");
privateObjectMapField.setAccessible(true);
NavigableMap<Integer, Class<?>> fieldValue =  (NavigableMap<Integer, Class<?>>) privateObjectMapField.get(instanceA);

// 5 is a key in the map so this should set declaredClass to an instance of InnerClass
Class<?> declaredClass = fieldValue.get(5).getClass();
Field fieldOne = declaredClass.getDeclaredField("fieldOne");
fieldOne.setAccessible(true);
Assert.assertEquals(100, fieldOne.getInt(declaredClass));
A instanceA=newa();
Field privateObjectMapField=A.class.getDeclaredField(“objectMap”);
privateObjectMapField.setAccessible(true);
NavigableMap declaredClass=fieldValue.get(5.getClass();
fieldOne=declaredClass.getDeclaredField(“fieldOne”);
fieldOne.setAccessible(true);
Assert.assertEquals(100,fieldOne.getInt(declaredClass));
在本例中,它在以下位置崩溃:
Class declaredClass=fieldValue.get(5.getClass()
错误如下:

java.lang.ClassCastException:com.test.A$InnerClass不能强制转换为java.lang.Class

有人知道这里出了什么问题吗

我希望这个例子是清楚的

谢谢

应该是

NavigableMap<Integer, InnerClass> fieldValue = (NavigableMap<Integer, InnerClass>) privateObjectMapField.get(instanceA); 
NavigableMap字段值=(NavigableMap)privateObjectMapField.get(instanceA);

简短回答:


objectMap
是一个
Map
,您将其视为一个
Map
,然后调用
fieldValue.get(5).getClass()
。这将在键
5
处获取对象,该对象恰好是
InnerClass
(但不需要在编译时指定),然后调用
object.getClass()
获取其类。

InnerClass是私有的,因此我的JUnit类看不到它,因此可能您必须更改您的类结构,因为在本例中无法测试/访问InnerClass。感谢您提供的信息。但我仍然有这个问题。我有:
NavigableMap字段值=(NavigableMap)privateObjectMapField.get(instanceA);类declaredClass=fieldValue.get(5.getClass();fieldOne=declaredClass.getDeclaredField(“fieldOne”);fieldOne.setAccessible(true);Assert.assertEquals(100,fieldOne.getInt(declaredClass))
这次它在getInt上失败:
无法将int field com.test.A$InnerClass.fieldOne设置为java.lang.Class
声明的类在这里是否仍然是类?听起来像是一个新问题——很难读懂注释中包含的这么多代码。但我鼓励您尝试将每个步骤分开,并用您对泛型如何工作的新理解自行调试它。:)
NavigableMap<Integer, ?> fieldValue = ...
fieldValue.get(5)
((Class<?>) fieldValue.get(5))
Object o = new InnerClass();
Class<?> boom = (Class<?>) o; // ClassCastException