2015-01-07 5 views
7
Object obj = new Object(); 
    try { 
     obj.getClass().getConstructor(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     dosomething();   
     e.printStackTrace(); 
    } 

例外をスローするので、このようなチェックは不要です。クラスに引数がないかどうかを確認するには

別の方法がありますか?

+1

なぜ例外恐怖症? – EJP

答えて

11

すべてConstructor秒を取得し、パラメータのその数をチェックし、あなたはあなたが非publicコンストラクタのためgetDeclaredConstructors()を使用する必要があると思います0

private boolean hasParameterlessPublicConstructor(Class<?> clazz) { 
    for (Constructor<?> constructor : clazz.getConstructors()) { 
     // In Java 7-, use getParameterTypes and check the length of the array returned 
     if (constructor.getParameterCount() == 0) { 
      return true; 
     } 
    } 
    return false; 
} 

を持っているものを見つけたとき停止することができます。

Streamで書き換えます。

private boolean hasParameterlessConstructor(Class<?> clazz) { 
    return Stream.of(clazz.getConstructors()) 
       .anyMatch((c) -> c.getParameterCount() == 0); 
} 
+2

コンストラクタ・クラスにはgetParameterCount()メソッドがありません。http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html – gerrytan

+1

@gerrytan [これは新しいJava 8メソッドです](http ://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html#getParameterCount--)。 'getParameterTypes'を使って、返される配列のサイズを調べることができます。 –

1

クラスのコンストラクタをループし、引数なしコンストラクタがあるかどうかを確認するメソッドを作成できます。

boolean hasNoArgConstructor(Class<?> klass) { 
    for(Constructor c : klass.getDeclaredConstructors()) { 
    if(c.getParameterTypes().length == 0) return true; 
    } 
    return false; 
} 

getDeclaredConstructors()を使用することにより、コンパイラによって追加デフォルトコンストラクタが含まれることに注意してください。例えば以下は、あなたがgetConstructors()を使用することができますが、それだけで見えるのコンストラクタをチェックする真

class A { } 

hasNoArgConstructor(A.class); 

を返します。したがって、あなたが春を使用している場合は、ClassUtils.hasConstructor()を使用することができます

3

falseを返します以下:

ClassUtils.hasConstructor(obj.getClass()); 
関連する問題