但是因为我这是一个Consumer类,获取到的方法名是代理类的名字
时间: 2024-04-13 20:30:45 浏览: 26
是的,您提到的问题是因为在Java中使用方法引用时,实际上会生成一个代理类来实现函数式接口。因此,通过`Thread.currentThread().getStackTrace()[1].getMethodName()`获取的是代理类的方法名,而不是原始类的方法名。
要解决这个问题,您可以在类A中添加一个成员变量,用于记录当前执行的方法名。在每个方法内部,将方法名赋值给该成员变量。这样,在Consumer中就可以通过访问类A的成员变量来获取当前执行的方法名。
以下是修改后的示例代码:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
class ClassA {
private String currentMethodName;
public void setCurrentMethodName(String methodName) {
this.currentMethodName = methodName;
}
public void method1(Map<String, Object> map) {
setCurrentMethodName("method1");
// 方法1的逻辑代码...
}
public void method2(Map<String, Object> map) {
setCurrentMethodName("method2");
// 方法2的逻辑代码...
}
public void method3(Map<String, Object> map) {
setCurrentMethodName("method3");
// 方法3的逻辑代码...
}
public void method4(Map<String, Object> map) {
setCurrentMethodName("method4");
// 方法4的逻辑代码...
}
}
public class Main {
public static void main(String[] args) {
List<Consumer<Map<String, Object>>> methods = new ArrayList<>();
ClassA rule = new ClassA();
methods.add(rule::method1);
methods.add(rule::method2);
methods.add(rule::method3);
methods.add(rule::method4);
Map<String, Object> map = new HashMap<>();
// 异常处理
methods.forEach(method -> {
try {
method.accept(map);
// 获取当前执行方法的方法名
ClassA classA = new ClassA();
String methodName = classA.currentMethodName;
System.out.println("当前执行的方法名为:" + methodName);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
```
在上述代码中,我们在ClassA类中添加了一个currentMethodName成员变量,并为其提供了一个setter方法。在每个方法内部,都调用了setCurrentMethodName方法来设置当前执行的方法名。然后,在Consumer中,我们通过创建一个新的ClassA对象并访问其currentMethodName成员变量来获取当前执行的方法名。
请注意,这种方法仅在类A中的方法直接被调用时有效,如果类A的方法通过其他方式间接调用,例如通过父类或接口引用调用,则无法正确获取方法名。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)