Java: dapatkan semua nama variabel di kelas

93

Saya memiliki sebuah kelas dan saya ingin menemukan semuanya bidang publiknya (bukan metode). Bagaimana saya bisa melakukan ini?

Terima kasih!

ufk
sumber
Anda harus dapat melakukan ini menggunakan API Refleksi .
Crozin

Jawaban:

135
Field[] fields = YourClassName.class.getFields();

mengembalikan array dari semua variabel publik kelas.

getFields()mengembalikan bidang di seluruh kelas-warisan. Jika Anda ingin menetapkan bidang hanya di kelas yang dimaksud, dan bukan kelas supernya, gunakan getDeclaredFields(), dan filter bidang tersebut publicdengan Modifierpendekatan berikut :

Modifier.isPublic(field.getModifiers());

The YourClassName.classliteral sebenarnya merupakan sebuah objek dari tipe java.lang.Class. Periksa dokumennya untuk mengetahui metode refleksi yang lebih menarik.

The Fieldkelas di atas adalah java.lang.reflect.Field. Anda dapat melihat seluruh java.lang.reflectpaket.

Bozho
sumber
2
hanya sebuah catatan - awalnya jawaban saya berisi pernyataan yang salah, namun mendapat suara positif beberapa kali. Harap baca lebih cermat;)
Bozho
1
@ downvoter - kesalahan itu sebelumnya. Jika Anda melihatnya sekarang, silakan bagikan.
Bozho
apakah solusi ini lambat? atau bisakah kita menggunakannya dengan bebas?
Dany Y
tidak apa-apa. Tapi jangan berlebihan.
Bozho
15

Anda dapat menggunakan salah satu dari keduanya berdasarkan kebutuhan Anda:

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

Untuk memfilter hanya bidang publik dari daftar di atas (berdasarkan kebutuhan) gunakan kode di bawah ini:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());
Sahil Chhabra
sumber
2

Seperti yang disebutkan oleh beberapa pengguna, kode di bawah ini dapat membantu menemukan semua bidang dalam kelas tertentu.

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

Namun pendekatan yang lebih menarik ada di bawah ini:

Dengan bantuan perpustakaan Jackson, saya dapat menemukan semua properti kelas tipe String / integer / double, dan nilai masing-masing dalam kelas Peta. ( tanpa menggunakan api refleksi! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
Amit Kaneria
sumber