getDeclaredConstructor on a interface?

2022-09-01 19:29:30

http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getDeclaredConstructor-java.lang.Class...-) 的 javadoc 说:Class::getDeclaredConstructor

返回一个构造函数对象,该对象反映由此类对象表示的类或接口的指定构造函数。[强调我的]

既然您无法为接口声明构造函数,那么返回接口的“指定构造函数”意味着什么?

我试穿了它,得到了.有没有在接口上工作的情况?或者javadoc中的这种语言只是一个错误?或者它意味着我解释它的方式之外的东西?Runnable.classNoSuchMethodExceptiongetDeclaredConstructor


答案 1

对 的调用将导致调用 检索所有声明的构造函数。从该列表中选择匹配的构造函数:Class.getConstructorClass.privateGetDeclaredConstructors

private Constructor<T>[] privateGetDeclaredConstructors(boolean publicOnly) {
    ...
    // No cached value available; request value from VM
    if (isInterface()) {
        @SuppressWarnings("unchecked")
        Constructor<T>[] temporaryRes = (Constructor<T>[]) new Constructor<?>[0];
        res = temporaryRes;
    } else {
        res = getDeclaredConstructors0(publicOnly);
    }
    ...
    return res;
}

(我删除了处理缓存构造函数的部分代码)。

因此,对于接口,构造函数列表始终为空,并且将始终抛出 a。NoSuchMethodException


答案 2

我不认为这是javadoc中的错误。 object可以表示类或接口,该语句中没有错误。Class

如果使用反射并显式请求特定元素,则必须确保具有反射调用中指定的标识的元素存在。如果你要求一个在提供的中不存在的特定构造函数,你会得到一个接口、基元类型、数组、void 的类,或者只是一个不声明这种构造函数的类。ClassNoSuchMethodException

上面我强调了“特定”这个词。例如,在返回 (Class::getDeclaredConstructors) 接口的所有构造函数的类似方法中,将相应地处理接口:Class

返回一个对象数组,该数组反映由此对象所表示的类声明的所有构造函数。这些是公共、受保护、默认(包)访问和私有构造函数。返回的数组中的元素不进行排序,也不按任何特定顺序排列。如果该类具有默认构造函数,则它包含在返回的数组中。如果 Class 对象表示接口、基元类型、数组类或 void,则此方法返回长度为 0 的数组。ConstructorClass