当前位置: 首页 > 知识库问答 >
问题:

接口上的getDeclaredConstructor?

司寇阳曦
2023-03-14

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

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

由于您不能为接口声明构造函数,因此返回接口的“指定构造函数”意味着什么?

我在Runnable上试过了。类,并获得了NoSuchMethodException。是否有一种情况下,getDeclaredConstructor将在接口上工作?或者javadoc中的这种语言只是一个错误?或者它意味着什么,而不是我如何解释它?

共有3个答案

毕黎昕
2023-03-14

这就是我能想到的用例:在基于反射的应用程序上,一个方法接收一个类参数。该方法需要构造给定类的实例,因此它会检查声明的构造函数。这是一个简化的示例,仅在四个不同的用例上打印构造函数:

>

  • 调用getClass()的类实例
  • 调用getClass()的接口实例
  • 实际的ClassX。等级
  • 实际的接口。班

    public class Testctor {
    
        public static void main(String[] args) {
            new Testctor().testGetDeclCtors();
        }
    
        public void testGetDeclCtors() {
            Class1 c1 = new Class1(4);
            printClassInfo(c1.getClass());
    
            I2 i2 = c1;
            printClassInfo(i2.getClass());
    
            printClassInfo(Class1.class);
    
            printClassInfo(I2.class);
        }
    
        private void printClassInfo(Class<?> claz) {
            Constructor<?> ctor = null;
            try {
                ctor = claz.getDeclaredConstructor();
            } catch (NoSuchMethodException | SecurityException e) {
            }
            System.out.println(claz+": "+ctor);
        }
    }
    
    interface I2 {
    }
    
    class Class1 implements I2 {
        public Class1() {
        }
    
        public Class1(int x) {
        }
    }
    

    这将打印这些结果:

    class test.Class1: public test.Class1()
    class test.Class1: public test.Class1()
    class test.Class1: public test.Class1()
    interface test.I2: null
    

  • 贺高杰
    2023-03-14

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

    如果您使用反射并显式要求特定元素,则必须确保具有反射调用中指定的标识的元素存在。如果您要求提供的Class中不存在的特定构造函数,您将获得NoSuchmetodException无论是接口的类、原始类型、数组、ulo还是简单的不声明此类构造函数的类。

    上面我强调了“特定”一词。例如,在返回类(Class::getDeclaredConstructors)的所有构造函数的类似方法中,接口得到了适当的处理:

    返回构造函数对象的数组,这些对象反映了由该类所表示的类声明的所有构造函数。它们是public、protected、default(package)access和private构造函数。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类具有默认构造函数,则它将包含在返回的数组中。如果此对象表示接口、基元类型、数组类或void,则此方法返回长度为0的数组。

    景信瑞
    2023-03-14

    调用类。getConstructor将导致调用类。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;
    }
    

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

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

     类似资料:
    • 问题内容: 我无法弄清楚能够注释Java接口的用例。 也许有人可以给我一个例子? 问题答案: 我在Spring中使用它来注释接口,其中注释应应用于所有子类。例如,假设您有一个Service接口,并且您可能具有该接口的多个实现,但是无论是否有注释,都希望应用安全注释。在这种情况下,对接口进行注释最有意义。

    • 给定以下代码: 我得到错误“找不到名称IMyInterfaceA”。处理这种情况的正确方法是什么?

    • 问题内容: 我认为多重继承在Java中总是非法的,但是这段代码可以编译: 是否有一个空接口,例如被认为是不好的做法?有没有一种方法可以避免空接口(使用泛型或其他方式)实现相似的目的? 注意:我不是在问如何通过接口模拟多重继承。我意识到我可以执行以下操作: 由于各种原因,我需要同时具有这两种方法的接口。 问题答案: 实现的 多重继承是不允许的。组件可以继承多个接口。 继承多个接口没有问题,因为您只是

    • 问题内容: 在具有有线和无线接口(例如192.168.1.x和192.168.2.x子网)的Linux系统上,我要发送UDP广播,该广播通过所有可用接口(即通过有线和无线接口)发送)。 当前,我将sendto()发送到INADDR_BROADCAST,但是似乎广播仅通过其中一个接口发送(并不总是相同的,后续广播可能使用另一个接口)。 有没有一种方法可以发送通过每个接口发送的UDP广播? 问题答案:

    • 我有一些工作流抽象依赖于接口: 现在我有三个不同的类来实现这个接口: 我得到一个错误,编译器不能推断函数接口类型。我的问题是:如何实现以下调用链: 当所有实例化的对象实现相同的接口时?

    • 问题内容: 我的问题是关于接口的设计选择。如果要从中创建上下文,可以执行以下操作: 如果是接口的一部分,那就更好了,这样我们可以简单地写: 对我来说似乎干净得多。它更短,并且不需要。 为什么产生子上下文的函数不是接口的一部分? 问题答案: 这是类型: 这很简单。如果要编写它的实现,可以这样做吗?是的,很容易。由于没有“设置”方法,因此每个方法都只能返回默认值/ 零值,并且是“有效”的实现。这正是背