Java: bir sınıftaki tüm değişken adlarını alın


93

Bir sınıfım var ve tüm genel alanlarını bulmak istiyorum (yöntemleri değil). Bunu nasıl yapabilirim?

Teşekkürler!


Bunu Reflection API kullanarak yapabilmelisiniz .
Crozin

Yanıtlar:


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

sınıfın tüm genel değişkenlerinin bir dizisini döndürür.

getFields()tüm sınıf mirasındaki alanları iade edin. Alanların üst sınıflarında değil, yalnızca söz konusu sınıfta tanımlanmasını istiyorsanız , aşağıdaki yaklaşımla olanları kullanın getDeclaredFields()ve filtreleyin :publicModifier

Modifier.isPublic(field.getModifiers());

YourClassName.classDeğişmezi aslında türünde bir nesneyi temsil java.lang.Class. Daha ilginç yansıtma yöntemleri için belgelerine bakın.

Yukarıdaki Fieldsınıf java.lang.reflect.Field. Tüm java.lang.reflectpakete bir göz atabilirsiniz .


2
sadece bir not - başlangıçta cevabım yanlış bir ifade içeriyordu, ancak birkaç kez yükseltildi. Lütfen daha dikkatli okuyun;)
Bozho

1
@downvoter - hata önceydi. Şimdi bir tane görürseniz, lütfen paylaşın.
Bozho

bu çözüm yavaş mı? ya da özgürce kullanabilir miyiz?
Dany Y

tamam. Ama aşırı kullanma.
Bozho


15

İhtiyacınıza göre ikisinden herhangi birini kullanabilirsiniz:

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.

Yukarıdaki listeden yalnızca genel alanları filtrelemek için (gereksinime göre) aşağıdaki kodu kullanın:

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

2

Birkaç kullanıcının bahsettiği gibi, aşağıdaki kod belirli bir sınıftaki tüm alanları bulmanıza yardımcı olabilir.

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));
    }
}

Ancak daha ilginç bir yaklaşım aşağıdadır:

Jackson kütüphanesinin yardımıyla String / integer / double türündeki tüm sınıf özelliklerini ve bir Map sınıfındaki ilgili değerleri bulabildim. ( yansımalar api kullanmadan! )

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());
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.