簡體   English   中英

在 static 子 class 中獲取調用父 class

[英]Get the calling parent class in a static child class

是否可以在 class 中使用 static 方法,獲取調用 class 的名稱。 我希望能夠在當前用於制作日志的 static class 中使用它。

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();
    }

}

我想知道我是否可以訪問 class 的名稱而無需在方法中傳遞它。

我不建議使用 TreffnonX 提供的答案,因為這是一項相當昂貴的任務,並且可能會減慢應用程序本身的速度 資源

相反,您可以使用自 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");
    }

}

這是 output

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM