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

Nie chcę tego typu, ponieważ rzuca wyjątek.Jak sprawdzić klasy nie ma argumentów konstruktor

Czy istnieje inny sposób?

+1

Dlaczego wyjątek-fobia? – EJP

Odpowiedz

11

można uzyskać wszystkie Constructor S i sprawdzić ich liczbę parametrów, zatrzymując się, gdy znajdziesz taki, który ma 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; 
} 

Trzeba by użyć getDeclaredConstructors() dla konstruktorów niepublicznych.

Przepisany z Stream.

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

Klasa konstruktora nie ma metody getParameterCount(): http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html – gerrytan

+1

@gerrytan [Jest to nowa metoda Java 8] (http : //docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html#getParameterCount--). Możesz użyć 'getParameterTypes' i sprawdzić rozmiar zwróconej tablicy. –

1

Można utworzyć metodę, która zapętla konstruktor klasy i sprawdzi, czy któryś z nich nie ma konstruktora arg.

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

Należy pamiętać, że za pomocą getDeclaredConstructors(), zostaną włączone domyślny konstruktor dodane przez kompilator. Np dodaje zwróci true

class A { } 

hasNoArgConstructor(A.class); 

Można użyć getConstructors() ale będzie to sprawdzić tylko widocznych konstruktorów. Stąd po zwróci false

Powiązane problemy