2016-07-01 6 views
0

Я пытался использовать метод getFields() на простой фиктивный классе следующим образом:

class C{ 
    public int a 
    int b 
    String s 
    float f 
    static int x 
} 

Я написал

def c = new C() 
println c.class.getFields() 

Это то, что я получил в качестве вывода:

[public int C.a, public static transient boolean C.__$stMC] 

Может кто-то объяснить, почему только a появляется в списке? А что такое другая организация C.__$stMC? Я искал в Интернете, кажется, что stMC представляет staticMetaClass. Просьба уточнить. Благодаря

ответ

0

Потому что согласно документации, GetFields() возвращает только открытые поля:

https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getFields()

либо использовать getDeclaredFields() или используйте Groovy свойства мета программирования именно:

def c = new C() 
println c.class.getDeclaredFields().toString() 
println c.getProperties().toString() 
+0

Но в Groovy все поля являются общедоступными по умолчанию. Итак, 'getFields()' должен включать их тоже, не так ли? Также есть идеи о $ stMC? Что это означает? –

+0

Все поля имеют модификаторы общего доступа. Когда вы меняете значение с помощью obj.prop = "x", под капотом он фактически вызывает метод. Под скомпилированным полем Java не является общедоступным. –