java - 在 java 方面使用 lambda 时出错
问题描述
我们有一个自定义注释:
@Target(value = {ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface AsyncWithTimeout {
long timeout();
}
和一个自定义@aspect
截取@AsyncWithTimeout
如下注释的方法,工作正常(注意任务定义,没有 lambda)
@Aspect
public class AsyncWithTimeoutInterceptor {
@Around(value = "@within(com.foo.AsyncWithTimeout) || " + "@annotation(com.foo.AsyncWithTimeout)")
public Object asyncWithTimeout(ProceedingJoinPoint point) {
long timeout = ((MethodSignature) point.getSignature()).getMethod().getAnnotation(AsyncWithTimeout.class).timeout()
// Task without lambda -> OK
Callable<Object> task = new Callable<Object>() {
public Object call() {
try {
// Do some stuff with the timeout...
} catch (Throwable throwable) {
// Do some stuff...
}
}
};
// Do some stuff ...
}
}
但是,如果我们使用 lambda 来初始化任务,则会引发异常:
@Aspect
public class AsyncWithTimeoutInterceptor {
@Around(value = "@within(com.foo.AsyncWithTimeout) || " + "@annotation(com.foo.AsyncWithTimeout)")
public Object asyncWithTimeout(ProceedingJoinPoint point) {
long timeout = ((MethodSignature) point.getSignature()).getMethod().getAnnotation(AsyncWithTimeout.class).timeout()
// Task with lambda -> Error
Callable<Object> task = () -> {
try {
// Do some stuff with the timeout...
} catch (Throwable throwable) {
// Do some stuff...
}
};
// Do some stuff ...
}
}
异常详情:
java.lang.IllegalStateException: there is no classname for invokedynamic
at org.aspectj.apache.bcel.generic.InvokeDynamic.getClassName(InvokeDynamic.java:126)
at org.aspectj.weaver.bcel.BcelAccessForInlineMunger.openAroundAdvice(BcelAccessForInlineMunger.java:141)
at org.aspectj.weaver.bcel.BcelAccessForInlineMunger.munge(BcelAccessForInlineMunger.java:80)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:441)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:101)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1689)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1633)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1398)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1155)
at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:527)
at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:363)
at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:121)
at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:54)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
编辑:实际上 aspectjweaver 版本是 1.8.0
使用的版本:jdk 1.8.0_124、aspectjweaver 1̶.̶9̶.̶1̶ 1.8.0
aop.xml
我的 META-INF 中的文件:
<aspectj>
<aspects>
<aspect name="com.foo.AsyncWithTimeoutInterceptor"/>
</aspects>
<weaver>
<include within="com.foo.*"/>
</weaver>
</aspectj>
我应该能够在方面使用 lambdas 还是存在某种限制/错误?任何帮助将不胜感激。
提前致谢。
解决方案
好吧,我在我的问题中犯了一个错误,使用的 aspectjweaver 版本实际上是1.8.0而不是1.9.1。
编辑:正如@kriegaex 在评论中指出的那样,该错误已在 1.8.13 aspectjweaver 版本中解决(无需升级到 1.9.1)感谢您的指出。
我刚刚检查了该错误在1.8.13及更高版本中已解决,因此 lambdas 可以毫无问题地用于方面。
推荐阅读
- python - Rasa Bot 按钮单击不响应
- azure-devops - 具有多个工件和阶段的 Azure DevOps 发布管道
- vue.js - 如果 q-draggable-tree-node 尚未定义,此代码如何工作
- python - 解释 One-Hot-Encoded SelectKBest 结果
- python - 在 python 中使用滞后函数来移动数据并创建新变量
- laravel - 如何创建和显示自动计算字段?
- linux - 如何使用 inotifywait 监控 /etc/shadow 文件?
- confluent-platform - k3s 和 kafka 网络——端口因某种原因被阻塞
- flask - 使用 flask-restx 进行 API 响应的 Swagger 文档
- apache-spark - Spark Graphx 从所有连接的节点创建图形