Saya memiliki sebuah kelas dan saya ingin menemukan semuanya bidang publiknya (bukan metode). Bagaimana saya bisa melakukan ini?
Terima kasih!
Jawaban:
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 public
dengan Modifier
pendekatan berikut :
Modifier.isPublic(field.getModifiers());
The YourClassName.class
literal sebenarnya merupakan sebuah objek dari tipe java.lang.Class
. Periksa dokumennya untuk mengetahui metode refleksi yang lebih menarik.
The Field
kelas di atas adalah java.lang.reflect.Field
. Anda dapat melihat seluruh java.lang.reflect
paket.
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html juga memiliki bagan untuk menemukan metode dan konstruktor.
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());
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());
}
}