Java 使用反射访问私有内部类字段
我想知道如何在JUnit测试中使用反射来访问私有内部类的私有字段 以下是我需要的一个示例: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
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