Springbean方法:如何获取方法名?

uinbv5nw  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(373)

假设我有一个java方法,它是用@bean注解的spring。
例子:

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”)。
有人有办法得到springbean的方法名吗?
提前谢谢

6jjcrrmo

6jjcrrmo1#

您还可以定义commandlinerunner的实现,但是它将打印“run”而不是commandlinerunner,但是作为previos解决方案的一个优点,“run”将在每次调用commandlinerunner时打印,而不仅仅是在创建bean时打印一次,我认为这更有用

@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
return new CommandLineRunner() {
        public void run(String... args) throws Exception {
            String strCurrMethodName = new Object() {
            }.getClass().getEnclosingMethod().getName();
            System.out.println(strCurrMethodName);
        }
    };
}
jv4diomz

jv4diomz2#

将获取方法名称的语句移到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 +"\"") ;
}

相关问题