Caused by: java.lang.NoSuchMethodException: java.util.HashMap$EntrySet.<init>()
at java.lang.Class.getConstructor0(Class.java:2902) ~[na:1.7.0_80]
at java.lang.Class.getDeclaredConstructor(Class.java:2066) ~[na:1.7.0_80]
我的JDK版本是1.7.0_80。当我执行以下JUnit测试代码时,错误消息将再次发生:
@Test
public void testGetDeclaredConstructor() throws NoSuchMethodException {
Map<String, Object> m1 = new HashMap<>();
Set<Map.Entry<String, Object>> entrySet = m1.entrySet();
Class clz = entrySet.getClass();
Constructor con = clz.getDeclaredConstructor();
con.setAccessible(true);
System.out.println("--------Test OK!");
}
答案 0 :(得分:3)
您可以通过列出已声明的构造函数来获得答案。
Set<Map.Entry<Object, Object>> entrySet = new HashMap<>().entrySet();
Constructor<?>[] declaredConstructors = entrySet.getClass().getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
java.util.HashMap $ EntrySet(java.util.HashMap)
因此,有一个构造函数,它以HashMap作为参数。因此,getDeclaredConstructor()
,(getDeclaredConstructor(Class<?>... parameterTypes)
,不带参数)会尝试获取不存在的构造函数。
答案 1 :(得分:1)
我不是反射专家,但是对我来说,entrySet
类中似乎没有默认构造函数。而getDeclaredConstructor()
就是您要的东西。