我想获取一个复杂对象的所有声明的方法。我有以下课程
class Person {
public String getName();
public String getDesignation();
public Address getAddress();
}
class Address {
public String city;
public String country;
}
现在什么时候使用反射
Person.class.getDeclaredMethod()
给出所有声明的方法
getName, getDesignation, getAddress
Person.class.getMethods()
给定已声明方法或超类方法中的所有方法
getName, getDesignation, getAddress, toString, waitFor
调用
Person.class.getMethods()
时如何获得子类的方法 最佳答案
如果要使用所有超类的所有公共方法,则必须迭代所有超类(通常是java.lang.Object除外)。
public static List<Method> getAllPublicMethods(Class<?> type){
Class<?> current = type;
List<Method> methods = new ArrayList<>();
while(type!=null && type!= Object.class){
Arrays.stream(type.getDeclaredMethods())
.filter((m)-> Modifier.isPublic(m.getModifiers())
&& !Modifier.isStatic(m.getModifiers()))
.forEach(methods::add);
type=type.getSuperclass();
}
return methods;
}
但是,如果您只对所有getter方法感兴趣,请改用
Introspector
。public static List<Method> getAllGetters(Class<?> type) {
try {
BeanInfo beanInfo = Introspector.getBeanInfo(type, Object.class);
return Arrays.stream(beanInfo.getPropertyDescriptors())
.map(PropertyDescriptor::getReadMethod)
.filter(Objects::nonNull) // get rid of write-only properties
.collect(Collectors.toList());
} catch (IntrospectionException e) {
throw new IllegalStateException(e);
}
}
有关Introspector的更多信息,请参见this previous answer of mine。