当前位置: 首页 > 面试题库 >

通过反射获取给定类的可访问方法的列表

姬泰
2023-03-14
问题内容

有没有一种方法可以获取给定类可访问(不一定是公共)的方法列表?有问题的代码将在完全不同的类中。

例:

public class A {
  public void methodA1();
  protected void methodA2();
  void methodA3();
  private void methodA4();
}

public class B extends A {
  public void methodB1();
  protected void methodB2();
  private void methodB3();
}

B我想上课:

  • 所有自己的方法
  • methodA1methodA2上课A
  • methodA3当且仅当class B与相同的程序包中A

methodA4永远不要包含在结果中,因为它是无法访问的B。再次说明一下,需要查找并返回上述html" target="_blank">方法的代码将位于完全不同的类/包中。

现在,Class.getMethods()仅返回公共方法,因此不会做我想要的;Class.getDeclaredMethods()只返回当前类的方法。虽然我当然可以使用后者,并手动检查可见性规则,然后逐步遍历类层次结构,但我不希望有更好的解决方案。我在这里错过明显的东西吗?


问题答案:

用于Class.getDeclaredMethods()从类或接口获取所有方法(私有方法或其他方法)的列表。

Class c = ob.getClass();
for (Method method : c.getDeclaredMethods()) {
  if (method.getAnnotation(PostConstruct.class) != null) {
    System.out.println(method.getName());
  }
}

注意:
这不包括继承的方法。使用Class.getMethods()了点。它将返回所有
公共 方法(是否继承)。

要全面列出类可以访问的所有内容(包括继承的方法),您需要遍历其扩展的类树。所以:

Class c = ob.getClass();
for (Class c = ob.getClass(); c != null; c = c.getSuperclass()) {
  for (Method method : c.getDeclaredMethods()) {
    if (method.getAnnotation(PostConstruct.class) != null) {
      System.out.println(c.getName() + "." + method.getName());
    }
  }
}


 类似资料:
  • 问题内容: 我试图使用反射获取不可见类的实例,即AKA包私有类。我想知道是否有一种方法可以切换修饰符以使其公开,然后使用进行访问。当我现在尝试尝试时,它会阻止我说我做不到。不幸的是,没有该类的方法。 问题答案: 嵌套类 -在其他类(包括静态和非静态类)中定义的类 内部类 -非静态嵌套类(内部类的实例需要外部类的实例存在) 非嵌套(顶级)类 根据您的问题,我们知道您要访问的构造函数不是公共的。因此您

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

  • 为了能够 动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getConstructors() getConstructor(Class<?>…parameterTypes) getDeclaredConstructors() getDeclaredConstructor(Class<?>...parameterTypes) 如果是访问指定的构造方法,需要根据该构

  • 如何使用反射来区分类重载方法,例如: <代码>方法()和<代码>方法(int-arg) 并调用此函数: 它返回错误,这意味着默认情况下选择没有参数的方法。如果我调用没有int参数的方法,它将工作。我问如何区分重载的方法?我已经阅读了的文档https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html还有一个关于SO的旧帖子,但两个来源都

  • 问题内容: 是否可以通过输入类名称作为字符串来获取类的所有实例? 像这样吗 任何反馈表示赞赏。谢谢。 问题答案: 不,没有类似的东西可用。如果您连接到调试API,则可以执行此操作,但在“正常”运行时则不能。

  • 问题内容: 只是玩弄Java反射,我想我大部分时间都掌握了它。我从这个问题/答案中了解到,在大多数情况下,我仅限于静态变量。如果我有该类的实例,则可以访问非静态变量,这确实有意义,我得到了很多。 说我有以下两节课: 我知道如何访问,这不是问题。我的理解是,我能得到的同样的方式(即)。从其他研究(javadocs,trails等)中,我收集到需要一个实例才能获得的值。 所以我的问题; 由于是静态的,