2012-01-04 39 views

Trả lời

0

Tôi không thể nhìn thấy bất cứ cách rõ ràng để kiểm tra cho một tài sản trực tiếp tĩnh, nhưng kiểm tra cho một phương pháp tĩnh tên getProperty là tương đương (tôi nghĩ)

def getStaticProperty(String name, Class clazz) { 
    def noArgs = [].toArray() 
    def methodName = 'get' + name[0].toUpperCase() 

    if (name.size() > 1) { 
    methodName += name[1..-1] 
    } 

    clazz.metaClass.getStaticMetaMethod(methodName, noArgs) 
} 

// class that will be used in tests 
class Foo { 

    static String x = 'bar' 
    static Integer num = 3 
} 

// tests 
assert getStaticProperty('x', Foo) 
assert getStaticProperty('num', Foo) 
assert getStaticProperty('noSuchProperty', Foo) == null 
5

tôi không thể nhìn thấy một cách groovier để làm điều này khác hơn là sử dụng phản chiếu Java API của:

import static java.lang.reflect.Modifier.isStatic 

class A { 
    static x = 1 
} 

def result = A.class.declaredFields.find { 
    it.name == 'x' && isStatic(it.modifiers) 
} 

println result == null ? 'class does not contain static X' : 
         'class contains static X' 
+0

Trường tĩnh (Java) có giống với thuộc tính tĩnh (Groovy) không? –

+0

Khi mã này hoạt động, tôi muốn nói có. – SteveD

+0

Chắc chắn là không. – Artefacto

3

nhìn vào GrailsClassUtils.getStaticFieldValue - nó trả về một stati c giá trị trường theo tên, null nếu không có thuộc tính nào tồn tại hoặc không được đặt. Bạn có thể xem xét thực hiện nếu đó là hữu ích

+0

Rất tiếc, liên kết không còn hợp lệ. Lỗi 404. –

+0

Ngay cả khi liên kết đã chết, bạn vẫn có thể sử dụng GrailsClassUtils –

1
A.metaClass.hasProperty(A,'x') 

hoặc

A.metaClass.respondsTo(A,'getX') 
0

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.

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