gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:12:17 25 4
gpt4 key购买 nike

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

例子:

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 当且仅当类 BA
  • 位于同一包中

methodA4 永远不应包含在结果中,因为 B 类无法访问它。再次澄清一下,需要查找并返回上述方法的代码将位于完全不同的类/包中。

现在,Class.getMethods() 只返回公共(public)方法,因此不会做我想做的事; Class.getDeclaredMethods() 只返回当前类的方法。虽然我当然可以使用后者并手动检查类层次结构以检查可见性规则,但如果有更好的解决方案,我宁愿不这样做。我在这里错过了什么明显的东西吗?

最佳答案

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

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

注意:这不包括继承的方法。使用Class.getMethods()为了那个原因。它将返回所有 public 方法(继承与否)。

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

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

关于java - 通过反射获取给定类的可访问方法列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com