Spring 中这样的方法名是怎样出现的呢?

rgbit
  • 186

我写了一个方法用来获取调用它的方法的名称:

/**
 * 获取调用栈中的方法名
 * <p>
 * StackTraceElement: [deduceInvokerMethodName, invoker...]
 *
 * @return 方法名
 */
private String deduceInvokerMethodName() {
    StackTraceElement[] stackTraceElements = new RuntimeException().getStackTrace();
    return stackTraceElements[1].getMethodName();
}

但是在实际使用中,我得到了类似如下形式的方法名:

invoker$original$4FWoUDJy

其中,$original$4FWoUDJy 部分是从何而来的呢?

这个方法位于这样一个类下面:

@Slf4j
@Validated
@RestController
@RequestMapping("/api/v2")
public class Api {}

同时使用了 AOP 拦截处理相关的请求,是 cglib 还是什么造成了这样的结果吗?

回复
阅读 606
2 个回答

$$这种一般是cglib创建的代理类的名字,来保证unique name
你可以先确定被代理的类。

// 将动态生成的代理类保存至指定的磁盘路径下
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,本地磁盘路径)

然后把生成的代理类class文件反编译一下,看能不能找到你要的名字。
没给线程的堆栈信息和具体代码,就先回答个思路吧。

这是内部类的命名方式,源码是没有的,编译后class文件的名称是这个格式,你也可以在本地写个内部类看看

你知道吗?

宣传栏