如何在java中找出调用方法的类?

如何在java中找出调用方法的类?,java,class,Java,Class,我如何在不向方法传递任何变量的情况下找出哪个类调用了我的方法? 假设我们有这样的东西: Class A{} Class B{} Class C{ public void method1{} System.out.print("Class A or B called me"); } 假设类A的一个实例调用类C的一个实例,类B也是如此。当类A调用类C method1方法时,我希望它打印类似“类A调用我”,当类B调用它打印“类B调用我” 您可以使用Thread.currentThread().get

我如何在不向方法传递任何变量的情况下找出哪个类调用了我的方法? 假设我们有这样的东西:

Class A{}
Class B{}
Class C{
public void method1{}
System.out.print("Class A or B called me");
}

假设类A的一个实例调用类C的一个实例,类B也是如此。当类A调用类C method1方法时,我希望它打印类似“类A调用我”,当类B调用它打印“类B调用我”

您可以使用
Thread.currentThread().getStackTrace()


它返回一个
[StackTraceElements][1]
数组,该数组表示程序的当前堆栈跟踪

没有真正简单的方法可以做到这一点,因为通常情况下,方法不需要也不应该关心从何处调用它。如果您编写方法,使其根据调用位置的不同而表现出不同的行为,那么您的程序很快就会变成无法理解的混乱

然而,这里有一个例子:

public class Prut {
    public static void main(String[] args) {
        example();
    }

    public static void example() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        StackTraceElement element = stackTrace[2];
        System.out.println("I was called by a method named: " + element.getMethodName());
        System.out.println("That method is in class: " + element.getClassName());
    }
}

+1这样做非常昂贵。如果性能很重要,则应避免使用。e、 g.日志记录经常使用此功能,它会显著降低应用程序的速度。请注意,这可能是一个非常缓慢的操作,因此在使用前请仔细考虑。此外,如果在您和“真实”调用方之间存在中间堆栈帧,例如,如果调用是通过反射进行的,那么它也没有帮助。如果安全管理器不允许获取线程的堆栈跟踪,它还会抛出SecurityException。@qoi当您谈论安全管理器时,您正在谈论的是J2EE框架?您可以逐个系统地在系统中设置自定义安全策略;我假设这是stacktrace的结构“String declaringClass,String methodName,String fileName,int LineNumber”,就像您使用的第二个一样,还是应该是stacktrace[1]?@sheidaei Yes,查阅class
StackTraceElement
@sheidaei No的API文档,应该是
stackTrace[2]
-试试看。为什么您想知道哪个类调用了您的方法?你想解决什么问题?@quooi为什么它应该是静态的?这是因为它正在访问StackTrace,而我们只希望有一个实例可以访问它吗?@SteveKuo我脑子里没有真正的应用程序,有一次我们和一些同事进行了java辩论,我知道这个问题很老,但这可能有用的一个原因是我目前遇到的问题:我有一个方法被调用了10次,应该只调用一次。弄清楚调用该方法的内容有助于导航堆栈和定位错误。