如何从 Thread.currentThread().getStackTrace() 获取方法签名不是方法名称?

问题描述

假设我有以下方法及其调用

public static void main(String[] args) {zoo();}
public static void zoo() {zoo(0);}
public static void zoo(int i) {too(i);}
public static void too(int i) {...}

Thread.currentThread().getStackTrace() 会返回给我类似的东西:

A.too(A.java:56)
A.zoo(A.java:65)
A.zoo(A.java:60)
A.main(A.java:80)

使用此输出,我无法区分我在示例中定义的 2 个 zoo一个没有任何参数 (zoo()),另一个带有整数参数 (zoo(int i))。原因是因为只输出方法名称而不是它们的签名。有没有办法得到一堆方法签名?

解决方法

Java 13 中 StackTraceElement 的文档清楚地表明没有办法做到这一点。您可以通过人脑通过行号识别重载方法。如果可能的话,自动化这个任务将是矫枉过正(需要使用反射),尽管我不认为某些库可以做到这一点。

备注:.class文件的二进制文件格式实际上是has the method signature information(至少是参数列表),所以也不是不可能,只是到现在还没有人开发。