我想获得复杂对象的所有声明方法。我有以下课程
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()
答案 0 :(得分:1)
如果你想要所有超类的所有公共方法,你将不得不遍历所有超类(通常除了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。