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

Java 在静态子类中获取调用父类,java,class,static,Java,Class,Static,如果类中存在静态方法,请获取调用类的名称。我希望能够在当前用于生成日志的静态类中使用它 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.p

如果类中存在静态方法,请获取调用类的名称。我希望能够在当前用于生成日志的静态类中使用它

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

}
公共类日志{
静态无效日志(a类,字符串b){
System.out.print(“[”+time()+“|”+a.getName()+”]“+”+b);
}
静态无效对数线(a类,字符串b){
System.out.println(“[”+time()+“|“+a.getName()+”]“+”+b);
}
静态无效日志(a类,字符串[]b){
for(int c=0;c

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

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

相反,您可以使用自Java 9以来提供的新的堆栈遍历API()。
它为堆栈遍历提供了一个高效的标准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");
    }

}

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

相反,您可以使用自Java 9以来提供的新的堆栈遍历API()。
它为堆栈遍历提供了一个高效的标准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");
    }

}

这看起来确实很好,但遗憾的是,我一直在使用Java 8,因为它需要在Windows XP上运行。这看起来确实很好,但遗憾的是,我一直在使用Java 8,因为它需要在Windows XP上运行。