aspect 在拦击 lambda 表达式 this::test()怎么使用
时间: 2023-02-09 15:27:43 浏览: 59
在 Java 8 中,您可以使用 "aspect" 来拦截 lambda 表达式 `this::test()`,方法是使用反射机制来获取方法引用所在的类的信息。
具体来说,您需要使用 `MethodHandles.lookup()` 方法来获取一个 `MethodHandles.Lookup` 对象,然后使用 `findSpecial()` 方法来获取方法的句柄。最后,您可以使用反射 API 来调用该方法。
例如:
```
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
public class Aspect {
public void intercept(Runnable runnable) throws Throwable {
// 获取方法引用所在的类
Class<?> clazz = runnable.getClass();
// 获取方法引用所在的对象(如果有的话)
Object target = null;
for (Method m : clazz.getDeclaredMethods()) {
if (m.getName().equals("get$Lambda")) {
if (m.isAccessible()) {
m.setAccessible(true);
}
target = m.invoke(runnable);
break;
}
}
// 获取方法的句柄
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findSpecial(
clazz,
"run",
MethodType.methodType(void.class),
clazz
);
// 调用方法
mh.invoke(target);
}
}
```
然后,您就可以这样使用 aspect 来拦截 lambda 表达式 `this::test()`:
```
Aspect aspect = new Aspect();
aspect.intercept(this::test);
```
希望这能帮助您!
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-dosexec](https://img-home.csdnimg.cn/images/20210720083343.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![csv](https://img-home.csdnimg.cn/images/20210720083646.png)