java.lang.NoSuchMethodException:java.util.HashMap $ EntrySet。<init>()

时间:2019-03-11 09:26:58

标签: java

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!");

}

2 个答案:

答案 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()就是您要的东西。