我想获取一个复杂对象的所有声明的方法。我有以下课程

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

10-06 14:13