如何检查一个Java类是否包含默认构造函数?

4

我希望查看一个Java类是否包含默认构造函数。

情况1:

public class ClassWithConstructor {

    //attributes...

    //default constructor
    public ClassWithConstructor(){}

}

案例2:

public class ClassWithoutConstructor {

    //attributes...

    // no default constructor

}

在情况1下,我希望打印出"ClassWithConstructor包含默认构造函数。" 在情况2下,我希望打印出"ClassWithoutConstructor不包含任何默认构造函数。"

8
但是在情况2中有一个默认构造函数。 - Madhawa Priyashantha
1
两者都具有Object的默认构造函数。 - Murat Karagöz
1
请注意,如果ClassWithoutConstructor没有构造函数,则实际上会有一个默认构造函数。 - SomeJavaGuy
8
实际上相反——情况1没有默认构造函数,因为您已经覆盖了它。默认构造函数是在您未提供构造函数时Java生成的构造函数。 - Vladimir
1
这被称为无参构造函数 - Gimby
显示剩余5条评论
3个回答

2

您无法检查此案例。没有构造函数的类会创建一个具有相同属性的默认构造函数,例如 public ClassName(){},但是您可以检查修饰符或属性是否更改。

如果您调试此代码,将看到两个 Constructors[] 具有相同的属性,除了 clazz 外,它们具有不同的名称。

import java.lang.reflect.Constructor;

import org.junit.Test;

public class ScriptBuilderTest {

@Test
public void test()  {

    Class<ObjectWithDeclaredConstructor> ObjectWithDC = ObjectWithDeclaredConstructor.class;
    Class<ObjectWithoutDeclaredConstructor> ObjectWithoutDC = ObjectWithoutDeclaredConstructor.class;

    Constructor<?>[] ctorsWithDC = ObjectWithDC.getDeclaredConstructors();
    Constructor<?>[] ctorsWithoutDC = ObjectWithoutDC.getDeclaredConstructors();

    System.out.println("end");
}

public class ObjectWithDeclaredConstructor{
    public ObjectWithDeclaredConstructor(){}
}

public class ObjectWithoutDeclaredConstructor{  }
}

非常感谢大家,我没有找到想要的内容,所以我将手动检查我的包,其中包含456个实体,看看它们中是否有任何一个不包含默认构造函数。 - James
欢迎您。如果您使用的是Unix系统,请尝试使用bash脚本在文件中查找已声明的构造函数;如果您使用的是MS系统,请尝试使用powershell脚本。 - viticlick
嘿,Viticlick,我正在使用Mac,我可以用脚本做吗?你能给我更多的解释吗? - James

2

嘿,FleshWound,谢谢你提供的链接。我使用反射API检查了这个解决方案,但它并没有给我想要的结果。可以说我想在Java类中搜索一个单词,我的单词是"public classname() {}",我想检查我的Java类是否包含这个单词。 - James
2
那需要查看源代码。你在运行时没有可用的源代码。 - Tim B
除非你手动解析文件级别的源文件,当然。 - endowzoner
1
有人可能会想使用Constructor.isSynthetic()(或检查符号修饰符),但(生成的)默认构造函数不被视为合成的。https://bugs.eclipse.org/bugs/show_bug.cgi?id=46699 - Oliver Gondža
1
尽管经过二次考虑,生成的默认构造函数具有包私有可见性,因此任何公共的无参数构造函数检测到都很可能会被明确声明为 OP 请求的构造函数。 - Oliver Gondža
隐式默认构造函数对于顶级类具有包私有可见性,但对于嵌套类可以具有不同的可见性。 - mernst

1
案例1: 在案例1中,您没有默认构造函数。但是在案例2中,您有一个默认构造函数。在案例1中,构造函数由您创建,而不是由编译器创建。在Java中,编译器始终负责创建默认构造函数。在案例1中,编译器代码如下所示。
public class ClassWithConstructor {


    public ClassWithConstructor(){
         super();//This code is generated by compiler
     }

}

S0 super() 是由编译器生成的,因为构造函数的第一行应该是 this() 或者 super()。由于它没有任何内容,我创建了 super()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接