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!
Yanıtlar:
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 :public
Modifier
Modifier.isPublic(field.getModifiers());
YourClassName.class
Değ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 Field
sınıf java.lang.reflect.Field
. Tüm java.lang.reflect
pakete bir göz atabilirsiniz .
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html'de ayrıca yöntemleri ve yapıcıları bulmak için grafikler bulunur.
İ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());
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());
}
}