2015-11-10 121 views
-1

我想檢查Java類是否包含默認構造函數。如何檢查java類是否包含默認構造函數

案例1:

public class ClassWithConstructor { 

    //attributes... 

    //default constructor 
    public ClassWithConstructor(){} 

} 

案例2:

public class ClassWithoutConstructor { 

    //attributes... 

    // no default constructor 

} 

在案例1中,我想打印"ClassWithConstructor contains a default constructor."

在第二種情況下,我想打印"ClassWithoutConstructor doesn't contain any default constructor"

+6

但如果2有一個默認的構造函數 –

+1

兩者都有對象 –

+1

的默認構造函數記住,如果'ClassWithoutConstructor'沒有構造,那麼你實際上將有一個默認的構造函數。 – SomeJavaGuy

回答

1

您可以通過Java Reflection API檢查您的課程,有一個名爲Constructor的課程(請參閱http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-frame.html)。但是,不確定您是否可以區分Java默認構造函數和您自己定義的無參數構造函數。

+0

嘿FleshWound,謝謝你的鏈接,我使用Reflection API檢查這個解決方案,但它並沒有給我我想要的。我們可以說我想在java類中搜索一個單詞,所以我的單詞是「public classname(){}」,我想檢查我的java類是否包含這個單詞。 – James

+1

這將涉及到查看源代碼。您在運行時沒有可用的源代碼。 –

+0

...除非您在文件級別手動解析源文件,當然。 – endowzoner

0

你不能檢查這種情況。沒有構造函數的類會創建一個默認的構造函數,它具有與public ClassName(){}相同的屬性,但您可以檢查修改器或屬性是否更改。

如果您調試此代碼,您將看到兩個構造函數[]具有除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{ } 
} 
+0

非常感謝你們,我沒有找到我想要的東西,所以我會手動檢查包含456個實體的包,如果它們中的任何一個不包含默認構造函數。 – James

+0

不客氣。如果您在Unix系統上,請嘗試使用bash腳本來查找文件中聲明的構造函數,或使用MS Systems中的powershell腳本。 – viticlick

+0

嘿viticlick,即時通訊使用mac,我可以用腳本來做,你能給我更多的解釋嗎? – James