美文网首页
Java 运行时获取调用类和调用方法名的几种方式

Java 运行时获取调用类和调用方法名的几种方式

作者: FX_SKY | 来源:发表于2017-08-02 18:20 被阅读591次

最近在封装一个Java报警的SDK,期望应用程序在调用SDK报警API方法时能调用类和调用方法名并通过邮件和短信的方式通知给开发者。

大致有两种方式,总结一下。

1. 通过Throwable.getStackTrace()

        StackTraceElement[] arr = (new Throwable()).getStackTrace();
        for(int i=0; i<arr.length; i++) {
            StackTraceElement el = arr[i];
            System.out.println(i+"\t"+el.getClassName()+"\t" +el.getMethodName()+"\t"+el.getLineNumber());
        }

简单模拟一下日志框架(log4j、lobback)的功能,如下:

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ${DESCRIPTION}
 *
 * @author Ricky Fung
 */
public class StackTraceTest {

    public static void main(String[] args) {

        Log log = new Log();
        log.info("hello");
    }
}

class Log {

    public void info(String msg) {
        System.out.println(String.format("%s | %s", getCaller(), msg));
    }

    public String getCaller() {
        StackTraceElement[] arr = (new Throwable()).getStackTrace();
        //打印格式: date | thread | class | msg
        StringBuilder sb = new StringBuilder(100);
        sb.append(getDate()).append(" | ").append(Thread.currentThread().getName()).append(" | ")
                .append(arr[2].getClassName()).append('(').append(arr[2].getMethodName()).append(':').append(arr[2].getLineNumber()).append(')');
        return sb.toString();
    }

    public String getDate() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
}

打印结果:
2017-08-17 14:35:27 | main | com.yirendai.titan.alert.StackTraceTest(main:16) | hello

2. 通过Thread的方法getStackTrace()

JDK1.5在Thread类里面引入了getStackTrace()和getAllStackTraces()两个方法。这下子,我们不用 (new Throwable()).getStackTrace ();可以调用
Thread.getCurrentThread().getStackTrace()来获得当前线程的运行栈信息。不仅如此,只要权限允许,还可以获得其它线程的运行栈信息。

StackTraceElement[] arr = Thread.currentThread().getStackTrace();

模拟日志框架,如下:

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ${DESCRIPTION}
 *
 * @author Ricky Fung
 */
public class StackTraceTest {

    public static void main(String[] args) {

        Log log = new Log();
        log.info("hello");
    }
}

class Log {

    public void info(String msg) {
        StackTraceElement[] arr = Thread.currentThread().getStackTrace();
        System.out.println(String.format("%s | %s", inferCaller(arr), msg));
    }

    public String inferCaller(StackTraceElement[] arr) {
        //打印格式: date | thread | class | msg
        StringBuilder sb = new StringBuilder(100);
        sb.append(getDate()).append(" | ").append(Thread.currentThread().getName()).append(" | ")
                .append(arr[2].getClassName()).append('(').append(arr[2].getMethodName()).append(':').append(arr[2].getLineNumber()).append(')');
        return sb.toString();
    }

    public String getDate() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }
}

相关文章

  • Java 运行时获取调用类和调用方法名的几种方式

    最近在封装一个Java报警的SDK,期望应用程序在调用SDK报警API方法时能调用类和调用方法名并通过邮件和短信的...

  • java反射和动态代理

    java反射 反射是程序运行时,通过反射直接操作对象或者类。获取类声明的属性和方法,调用方法或者构造对象,设置修改...

  • Java Tips

    Java中比较日期:ComparatorDate.java类 调用: java计算运行时间

  • 静态方法和实例方法有何不同

    在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方...

  • Android WebView 安全性

    Android原生与Html交互方式 Java调用Js 方式1 方式2(API >= 19) Js调用Java 方...

  • 反射的一些常规操作及简单的自定义注解

    获得Class类的四种方式1.调用运行时类本身的.class属性 2.通过运行时类的对象获取 3..通过Class...

  • iOSDebug表达式

    func//所在类调用方法名PRETTY_FUNCTION//所在类调用方法名LINE//代码所在行FILE//代...

  • 反射

    反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。 反射是Java被...

  • Spring详解(三)Spring的IOC容器

    IOC容器实例化对象的几种方式: 调用无参构造 调用有参构造 调用其他对象构造 调用工厂类静态方法 调用工厂类非静...

  • 2020-07-23反射、获得构造方法

    反射概述 java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一...

网友评论

      本文标题:Java 运行时获取调用类和调用方法名的几种方式

      本文链接:https://www.haomeiwen.com/subject/gcdylxtx.html