Java 获取有关调用类的信息

Java 获取有关调用类的信息,java,reflection,Java,Reflection,有可能获取调用另一个类的类的信息吗 如何进入这个地方: System.out.println(bar.getInvokingClassInfo()); 关于调用Foo的类的信息这一条: Invoking class: Foo 这将获取当前线程的堆栈跟踪。如评论中所述,存在实施差异,因此如果您担心这种情况,您可以实施如下内容: 使用在循环外部声明的计数器变量循环StackTraceeElement数组 每当遇到当前类名和当前方法时,请中断 获取数组的下一个元素-它将是调用程序。这就是上面代码中

有可能获取调用另一个类的类的信息吗

如何进入这个地方:


System.out.println(bar.getInvokingClassInfo());
关于调用Foo的类的信息这一条:

Invoking class: Foo
这将获取当前线程的堆栈跟踪。如评论中所述,存在实施差异,因此如果您担心这种情况,您可以实施如下内容:

使用在循环外部声明的计数器变量循环StackTraceeElement数组 每当遇到当前类名和当前方法时,请中断 获取数组的下一个元素-它将是调用程序。这就是上面代码中索引的含义 如果上面没有提供相关信息,您可以始终返回new Exception.getStackTrace 这将获取当前线程的堆栈跟踪。如评论中所述,存在实施差异,因此如果您担心这种情况,您可以实施如下内容:

使用在循环外部声明的计数器变量循环StackTraceeElement数组 每当遇到当前类名和当前方法时,请中断 获取数组的下一个元素-它将是调用程序。这就是上面代码中索引的含义 如果上面没有提供相关信息,您可以始终返回new Exception.getStackTrace
我所能想到的最好的、虽然扭曲但丑陋的解决方案是在条内抛出一个异常并立即捕获它,然后从堆栈跟踪中提取调用方信息


根据其他人的评论进行更新:您甚至不需要抛出并捕获异常,new exception.getStackTrace就可以做到这一点。

我所能想到的最好但扭曲难看的解决方案是在条内抛出异常并立即捕获,然后从其堆栈跟踪中提取调用方信息


根据其他人的评论进行更新:您甚至不需要抛出和捕获异常,new exception.getStackTrace就可以做到这一点。

我能想到的最可靠的方法是将此作为参数从A内部传递给B。然后B可以查看对象,并打印出其类


任何干扰堆栈跟踪的东西都依赖于不保证工作的东西。这种方法最有效的方法是将其作为参数从A内部传递给B。然后B可以查看对象,并打印出其类


任何干扰堆栈跟踪的东西都依赖于不保证工作的东西。这种方法的成功之处在于。

在我们使用Java 7的上下文中,找到调用方的唯一安全方法是:

private static class ClassLocator extends SecurityManager {
    public static Class<?> getCallerClass() {       
        return new ClassLocator().getClassContext()[2];
    }
}
正如API参考文件所述:

受保护类[]getClassContext 以类数组的形式返回当前执行堆栈。 数组的长度是执行堆栈上的方法数。索引0处的元素是当前正在执行的方法的类,索引1处的元素是该方法的调用方的类,依此类推


在我们使用Java 7的上下文中,了解调用者的唯一安全方法是:

private static class ClassLocator extends SecurityManager {
    public static Class<?> getCallerClass() {       
        return new ClassLocator().getClassContext()[2];
    }
}
正如API参考文件所述:

受保护类[]getClassContext 以类数组的形式返回当前执行堆栈。 数组的长度是执行堆栈上的方法数。索引0处的元素是当前正在执行的方法的类,索引1处的元素是该方法的调用方的类,依此类推


那是不对的。数组的第一个元素是getStackTrace方法,以及可能由getStackTrace在内部调用的其他方法。不同版本的Sun虚拟机在这里表现出不同的行为。在1.5.0_15中,前两个元素是Thread.dumpThreads和Thread.getStackTrace,而在1.5.0_18中,第一个元素是Thread.getStackTrace。它完全符合我的目的:我知道它有点奇怪,但对于调试内容来说,它是可以的。再一次:在到达调用getStackTrace的类之前,数组中的元素数是特定于实现的。使用固定索引1或2将不是一个可移植的解决方案。getStackTrace上的Javadoc表示,即使是空数组也可能返回。也就是说,我不知道更好的方法,但堆栈跟踪需要比stackTrace更多的解释[2]@stroboskop:只有在调用getStackTrace的线程尚未启动或已终止时,数组才能为空。对于当前线程,这是不可能的。这是不正确的。数组的第一个元素是getStackTrace方法,以及可能由getStackTrace在内部调用的其他方法。不同版本的Sun虚拟机在这里表现出不同的行为。在1.5.0_15中,前两个元素是Thread.dumpThreads和Thread.getStackTrace,而在1.5.0_18中,第一个元素是Thread.getStackTrace。它完全符合我的目的:我知道它有点奇怪,但对于调试内容来说没关系。再一次:在到达
调用getStackTrace的e类是特定于实现的。使用固定索引1或2将不是一个可移植的解决方案。getStackTrace上的Javadoc表示,即使是空数组也可能返回。也就是说,我不知道更好的方法,但堆栈跟踪需要比stackTrace更多的解释[2]@stroboskop:只有在调用getStackTrace的线程尚未启动或已终止时,数组才能为空。这对于当前线程来说是不可能的。事实上没有那么难看-这是线程实现的一部分,虽然不是常见的情况。getStackTraceIt的我认为比前一个更合适的方法,但是想象一下,许多类扩展了类栏,扩展的类出现在很多地方,所以。。。许多try/catch子句,许多行新代码。我们可以简化代理,但值得吗?@kospiotr如果你想在Bar及其子类中的许多不同方法中获取调用方信息,你可以通过在一个受保护的Bar方法中实现此解决方案,然后从所有其他方法调用它来实现。当然,然后堆栈跟踪分析器应该从数组中的第三项开始搜索,当然,如果元素足够多,则从第二项开始搜索。实际上,您不必抛出异常来获得堆栈跟踪。new Exception.getStackTrace可以解决在数组中查找正确偏移量的问题,这是Bozho解决方案的一部分。事实上并不难看-这是线程实现的一部分,但不是常见的情况。getStackTraceIt的我认为比前一种更合适的方法,但是想象一下,许多类扩展了类栏,扩展的类出现在很多地方,所以。。。许多try/catch子句,许多行新代码。我们可以简化代理,但值得吗?@kospiotr如果你想在Bar及其子类中的许多不同方法中获取调用方信息,你可以通过在一个受保护的Bar方法中实现此解决方案,然后从所有其他方法调用它来实现。当然,然后堆栈跟踪分析器应该从数组中的第三项开始搜索,当然,如果元素足够多,则从第二项开始搜索。实际上,您不必抛出异常来获得堆栈跟踪。新的Exception.getStackTrace可以解决在数组中找到正确偏移量的问题,这是Bozho的解决方案。
private static class ClassLocator extends SecurityManager {
    public static Class<?> getCallerClass() {       
        return new ClassLocator().getClassContext()[2];
    }
}