在Java 8中以静态方式获取类名[重复]

Posted

技术标签:

【中文标题】在Java 8中以静态方式获取类名[重复]【英文标题】:Get class name in a static way in Java 8 [duplicate] 【发布时间】:2020-02-02 02:25:17 【问题描述】:

这是对more general and similar question/answers的跟进

Java 8 中,我可以使用 new Exception 获取调用方法的类名

String className = new Exception().getStackTrace()[1].getClassName();

但是我可以通过静态方式获取类名吗?

编辑

如果我在另一个类的方法中并且想知道调用我的方法的类

【问题讨论】:

根据您对以下答案的评论,可以肯定地说您正在寻求一种从方法调用中静态确定调用类的类名的方法吗? @gus 是的 我不认为你可以静态地做到这一点,但你可以做到这一点,而不必使用Thread.currentThread().getStackTrace();创建Exception “知道调用我的方法的类”应该如何以静态方式工作?一个方法可以从很多其他类中调用,唯一我能想到的是每个调用类都必须将其类名作为参数传递给被调用方法 @CarlosHeuberger StackWalker in Java 9 【参考方案1】:

从另一个类中静态获取调用类的类名的例子:

public class Main 
    public static void main(String[] args) 
        example();
    

    public static void example() 
        B b = new B();
        b.methodB();
    


class B 
    public void methodB()
        System.out.println("I am methodB");
        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());
    

静态获取全限定类名示例:

MyClass.class.getName();

【讨论】:

我在另一个类的方法中,想知道调用我的方法的类 我已经更新了答案。如果它回答了您的问题,请告诉我。【参考方案2】:

获取调用堆栈的 Java9+ 技术使用StackWalker。 Ritesh Puj's answer 使用StackWalker 的等价物如下:

public class Main 
    public static void main(String[] args) 
        example();
    

    public static void example() 
        B b = new B();
        b.methodB();
    


class B 
    public void methodB()
        System.out.println("I am methodB");
        StackWalker.getInstance()
                   .walk(frames -> frames.skip(1).findFirst())
                   .ifPresent(frame -> 
                        System.out.println("I was called by a method named: " + frame.getMethodName());
                        System.out.println("That method is in class: " + frame.getClassName());
                   );
    

使用StackWalker 的好处是它会延迟生成堆栈帧。这避免了Thread.getStackTrace() 在创建大量堆栈帧时产生的费用。如果调用堆栈很深,并且您只想查找几个帧(如本例所示),则创建完整的堆栈跟踪尤其浪费。

【讨论】:

是否有 Java 8 等价物? @user7294900 不,StackWalker 是在 Java 9 中引入的。Ritesh Puj 的回答中可能显示了最好的 Java 8 方法,即获取完整的堆栈跟踪。

以上是关于在Java 8中以静态方式获取类名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

nextjs用静态类名添加动态类名[重复]

其他功能的静态类的理想类名[重复]

在MFC中:静态文本类;按纽类;编辑框类;滚动条类;列表框类;组合框类等所对应的类名以及其功能

java 8中存储的静态变量在哪里? [重复]

Java中通过Class类获取Class对象的方法详解

在 C++ 中以编程方式在编译时创建静态数组