获取复杂对象的DeclaredMethods

时间:2016-06-03 16:03:16

标签: java reflection

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

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()

时获取子类的方法

1 个答案:

答案 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