如何解决spring bean方法:如何获取方法名称?
假设我有一个用 @Bean 注释的 java 方法。
示例:
public void coco() {
String strCurrMethodName = new Object(){}.getClass().getEnclosingMethod().getName();
System.out.println("Méthode : \"" + strCurrMethodName +"\"") ;
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return args -> {coco();
String strCurrMethodName = new Object(){}.getClass().getEnclosingMethod().getName();
System.out.println("Méthode : \"" + strCurrMethodName +"\"") ;
};
}
这是控制台输出:
方法:“可可”
方法:“lambda$0”
如您所见,我们可以为非 bean 方法获取方法名称。 但是对于 bean 方法,我们不会获取方法名称,而是获取由 spring 管理的通用值(我们获取“lambda$0”而不是“commandLineRunner”。
有没有人有办法获取spring bean的方法名?
提前致谢
解决方法
将获取方法名称的语句移到 lambda 表达式之外:
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
String strCurrMethodName = new Object(){}.getClass().getEnclosingMethod().getName();
return args -> {coco();
System.out.println("Méthode : \"" + strCurrMethodName +"\"") ;
};
}
不能从 lambda 表达式内部完成的原因是 commandLineRunner
方法在代码运行时早已不复存在,因为编译器将 lambda 块转换为隐藏(合成)方法,并且用对该方法的引用替换 lambdas 表达式。
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return MyClass::lambda$0;
}
private synthetic void lambda$0(String... args) {
coco();
String strCurrMethodName = new Object(){}.getClass().getEnclosingMethod().getName();
System.out.println("Méthode : \"" + strCurrMethodName +"\"") ;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。