【问题标题】:Get the calling parent class in a static child class在静态子类中获取调用父类
【发布时间】:2020-09-23 07:57:41
【问题描述】:

类中的静态方法是否可以,获取调用类的名称。我希望能够在当前用于制作日志的静态类中使用它。

public class Log {

    static void log(Class a, String b){
        System.out.print("[" + time() + "|" + a.getName() + "]" + " " + b);
    }
    static void logLine(Class a, String b){
        System.out.println("[" + time() + "|" + a.getName() + "]" + " " + b);
    }
    static void log(Class a, String[] b){
        for(int c = 0; c < b.length; c++){
            Log.logLine(a, b[c]);
        }
    }
    static String time(){
        return "" + java.time.LocalTime.now();
    }

}

我想知道我是否可以在不需要在方法中传递的情况下访问类的名称。

【问题讨论】:

    标签: java class static


    【解决方案1】:

    我不建议使用 TreffnonX 提供的答案,因为这是一项相当昂贵的任务并且它可能会减慢应用程序本身的速度Source

    相反,您可以使用自 Java 9 起提供的新 Stack Walking API (Javadoc)。
    它为堆栈遍历提供了一个高效的标准 API,可以轻松过滤, 并且懒惰地访问堆栈跟踪中的信息。

    这是一个例子

    import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE;
    
    class Log {
    
        public static void main(String ...args){
            new SomeObject().execute();
        }
    
        static void log(String b){
    
            StackWalker walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE);
    
            Class<?> callerClass = walker.getCallerClass();
    
            System.out.print("[" + time() + "|" + callerClass.getName() + "]" + " " + b);
        }
    
        static String time(){
            return "" + java.time.LocalTime.now();
        }
    
    }
    
    class SomeObject {
    
        public void execute(){
            Log.log("I'm doing something");
        }
    
    }
    

    这是输出

    [12:13:17.146856|SomeObject] I'm doing something
    

    【讨论】:

    • 这确实看起来好多了,但遗憾的是我坚持使用 Java 8,因为它需要在 Windows XP 上运行。
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多