Java 获取类调用的函数的名称

Java 获取类调用的函数的名称,java,class,function,reflection,Java,Class,Function,Reflection,同一包装中有两个类别A和B 如何获取类B调用的类A函数的名称 限制是A和B的代码不能修改 反射可能非常有用,但如果您不理解它,则会非常复杂 如果您有类的名称,并且希望打印方法: Class c = Class.forName(the_class_name); for(Method m : c.getMethods()) { System.out.println(m.toString()); } 如果需要给定任何对象的类的名称: String className = the_object.

同一包装中有
两个类别A和B

如何获取类B调用的类A函数的名称


限制是A和B的代码不能修改

反射可能非常有用,但如果您不理解它,则会非常复杂

如果您有类的名称,并且希望打印方法:

Class c = Class.forName(the_class_name);

for(Method m : c.getMethods()) {
  System.out.println(m.toString());
}
如果需要给定任何对象的类的名称:

String className = the_object.getClass().getName();
两者的组合可能如下所示:

for(Method m : the_object.getClass().getMethods())
  System.out.println(m.toString());
我想你要的是
A
中调用
B
的所有方法的名称

反射不能真正做到这一点,主要是因为Java没有提供任何方法来实现这一点

,一如既往,提供了更多信息。如果您仔细查看,可能会找到一个简单的解决方法。

“类a或类B调用的所有函数的类”令人困惑。但是,如果您想获取类
a
中描述的方法
detectsName
的调用方的类和函数名,那么下面的代码将对您有用

public class A {
    public void detectsName() {
        Throwable t = new Throwable();
        StackTraceElement traceLine = t.getStackTrace()[1];
        // t.printStackTrace();
        String className = traceLine.getClassName();
        String methodName = traceLine.getMethodName();
        int lineNumber = traceLine.getLineNumber();
        System.out.println(className);
        System.out.println(methodName);
        System.out.println(lineNumber);
    }
}
如果您从任何其他类(如-B)调用此方法,它将被检测到

public class B {
    public static void main(String[] args) {
        A a = new A();
        a.detectsName();
    }
}

您不能使用Java反射来执行这样的静态代码分析任务。反射API不提供所需的信息

在我脑海中,我能想到两种可行的方法:

  • 如果只有“.class”文件,那么可以使用字节码库(如BCEL)加载类并遍历它们以识别所有方法调用

  • 如果您有源代码,还可以使用一些现有的Java解析器库为代码创建AST并对其进行分析


(如果您只需要一个类和方法名的列表,那么第一种方法可能更简单。)

可以对此进行查询。它的方法是用XML生成元数据,然后使用基于regexp的比较。您可能正在寻找名为“closure”的入站引用功能。

目前还不清楚询问的是什么,请更新您的问题,以便更清楚地了解您想要做什么。另外,请发布您尝试的代码。是否要在运行时执行此操作?通过静态分析?根据您目前发布的内容,按照目前的标准来看,这不是一个真正的问题。@JimGarrison我想通过静态分析来实现这一点。