java在几个场景下获取类名及方法名

  • 一、从线程中获取
  • 二、从异常中获取
  • 三、在GlobalExceptionHandler类捕获全局异常时获取


一、从线程中获取

//获取当前类的类名
String className = this.getClass().getName();

//获取当前方法
String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();

二、从异常中获取

补充信息

什么是StackTrace

StackTrace(堆栈轨迹)存放的就是方法调用栈的信息,每次调用一个方法会产生一个方法栈,当前方法调用另外一个方法时会使用栈将当前方法的现场信息保存在此方法栈当中,获取这个栈就可以得到方法调用的详细过程。例如:异常处理中常用的e.printStackTrace()实质就是打印异常调用的堆栈信息。

StackTraceElement介绍

StackTraceElement表示StackTrace(堆栈轨迹)中的一个方法对象,通过这个对象可以获取调用栈当中的调用过程信息,包括方法的类名、方法名、文件名以及调用的行数。查看StackTraceElement类的源代码,我们可以获取方法所在行、所在类等的信息;

//方法的入参 Exception e
StackTraceElement traceElement = e.getStackTrace()[0];

//获取当前类的类名
String className = traceElement.getClassName();
//获取当前方法
String methodName = traceElement.getMethodName();

三、在GlobalExceptionHandler类捕获全局异常时获取

注意:当在捕获全局异常的这个类中,并不能通过以上两种方法获取方法名或方法路径

//根据前端请求获取方法名、参数、路径等信息
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
    ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
    HttpServletRequest request = attributes.getRequest();

	//traceId 
    String traceId = request.getHeader("traceId");
    //方法URL
    String methodUrl = request.getRequestURI();
    //请求方式
    String method = request.getMethod();
}

补充信息
通过request获得请求信息
当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,在HTTPServletRequest接口中,定义了一系列用于获取请求行的方法,如下表:

方法声明

功能描述

String getMethod()

该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)

String getReauestURI()

该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分

String getQueryString()

该方法用于获取请求行中的参数部分,也就是资源路径后面问号以后的所有内容

String getProtocol()

该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0 或 HTTP/1.1

String getContextPath()

该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以"/"开头,表示相对于整个WEB站点的根目录,路几个结尾不含“/”。如果请求URL属于web站点的根目录,那么返回结果为空字符串“”

String getServletPath()

该方法用于获取Servlet的名称或Servlet所映射的路径

String getRemoteAddr()

该方法用于获取请求客户端的IP地址,其格式类似于"192.168.0.1"

String getRemoteHost()

该方法用于获取请求客户端的完整主机名,其格式类似于"pc1.xxxx.cn"。需要注意的是,如果无法解析出客户机的完整主机名,该方法会返回客户端的IP地址

int getRemotePort()

该方法用于获取请求客户端网络连接的端口号

String getLocalAddr()

该方法用于获取Web服务器上接收当前请求网络连接的IP地址

String getLocalName()

该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名

int getLocalPort()

该方法用于获取Web服务器上接收当前网络连接的端口号

String getServerName()

该方法用于获取当前请求所指向的主机名,即HTTP请求消息中HOST头字段所对应的主机名部分

int getServerPort()

该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中HOST头字段所对应的端口号部分

String getScheme()

该方法用于获取请求的协议名,例如http、https或ftp

StringBuffer getRequestURL()

该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestRUL()方法返回的时StringBuffer类型,而不是String类型。