在静态子类中获取调用父类。

问题描述 投票:0回答:1

是否可以让一个类中的静态方法,得到调用类的名称。我希望能够在一个目前用于制作日志的静态类中使用这个方法。

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个回答
2
投票

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

相反,您可以使用新的 栈式行走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
© www.soinside.com 2019 - 2024. All rights reserved.