2015-01-07 19 views

Trả lời

11

Bạn có thể nhận được tất cả Constructor s và kiểm tra số của họ về các thông số, dừng lại khi bạn tìm thấy một trong đó có 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; 
} 

Bạn sẽ phải sử dụng getDeclaredConstructors() cho nhà xây dựng ngoài công lập.

Được viết lại với Stream.

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

Lớp trình xây dựng không có phương thức getParameterCount(): http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html – gerrytan

+1

@gerrytan [Đó là một phương pháp Java 8 mới] (http : //docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html#getParameterCount--). Bạn có thể sử dụng 'getParameterTypes' và kiểm tra kích thước của mảng được trả về. –

1

Bạn có thể tạo phương thức lặp lại hàm tạo của lớp và kiểm tra xem có bất kỳ hàm tạo nào không có arg không.

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

Lưu ý rằng bằng cách sử dụng getDeclaredConstructors(), hàm tạo mặc định được trình biên dịch thêm sẽ được bao gồm. Ví dụ: sau sẽ trả về true

class A { } 

hasNoArgConstructor(A.class); 

Bạn có thể sử dụng getConstructors() nhưng nó sẽ chỉ kiểm tra các nhà thầu hiển thị. Do đó sau sẽ trả về false

Các vấn đề liên quan