Tính đến năm 2017 và 2.4.x groovy, cách tốt nhất để kiểm tra dường như này:
A.metaClass.getMetaProperty('x') != null
Nó làm việc cho cả thuộc tính tĩnh và không tĩnh cũng như đối với các thuộc tính được định nghĩa chỉ với getter và setter (nhưng không có trường thực tế), hoặc bởi một trường không có getter hoặc setter (ví dụ trong một lớp java). Bạn có thể kiểm tra MetaProperty được trả lại để biết thêm chi tiết nếu cần. Hãy coi chừng rằng một thuộc tính có thể được định nghĩa bởi một setter chỉ vì thế không thể đọc được. Vì vậy, nếu nó là quan trọng, điều chỉnh kiểm tra của bạn cho phù hợp.
Lưu ý rằng phương pháp này không cho phép kiểm tra xem thuộc tính có tĩnh hay không.
câu trả lời sudhir có lẽ là thứ hai tốt nhất, vì nó thực hiện dựa trên getDeclaredFields và kết quả là, không tìm thấy thuộc tính được xác định chỉ bằng getter và setter. Nó cũng chỉ hữu ích nếu bạn đang sử dụng grails. Nó cũng lấy giá trị thực tế nếu hiện tại có thể hoặc có thể không được mong muốn.
Câu trả lời của SteveD không hoạt động. Tuy nhiên, có thể được cố định bằng cách loại bỏ 'lớp' trước declareFields và thêm kiểm tra cho getters và setters. Vì vậy, kiểm tra đầy đủ cho sự tồn tại bất động sản như sau:
def hasProperty = { Class c, String propertyName ->
if (!propertyName)
return false;
String p2 = propertyName.substring(0, 1).toUpperCase()
if (propertyName.length()> 1)
p2 += propertyName.substring(1)
return c.declaredFields.find {
it.name == propertyName /* && isStatic(it.modifiers) */
} || c.declaredMethods.find {
it.name == ('get' + p2) /* && isStatic(it.modifiers) */
} || c.declaredMethods.find {
it.name == ('is' + p2) /* && isStatic(it.modifiers) */
} || c.declaredMethods.find {
it.name == ('set' + p2)/* && isStatic(it.modifiers) */
}
}
Lưu ý rằng phương pháp này cũng kiểm tra rằng bất động sản thực sự là tĩnh (chỉ cần nhập tĩnh java.lang.reflect.Modifier.isStatic và kiểm tra isStatic bỏ ghi chú). Tương tự như trên, hãy cẩn thận với các thuộc tính chỉ thiết lập.
Trường tĩnh (Java) có giống với thuộc tính tĩnh (Groovy) không? –
Khi mã này hoạt động, tôi muốn nói có. – SteveD
Chắc chắn là không. – Artefacto