【问题标题】:Declared exceptions in Java interface from Kotlin来自 Kotlin 的 Java 接口中声明的异常
【发布时间】:2019-04-24 10:43:18
【问题描述】:

我有一组 Web 服务,它们被带有 @AfterThrowing 的 Aspect 拦截。 Web 服务的实现是在 Kotlin 中完成的,但它是基于生成的 Java 代码。

所以我有一个 Java 接口和一个实现该接口的 Kotlin 类。当代码抛出时,我想一般地在 Java 接口中抛出定义的错误(SomeFault):

public SomeResponseType methodName() throws SomeFault

如果一切都在 Java 中,它可以像这样很容易地完成:

MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
Class<? extends Exception>[] declaredExceptions = methodSignature.getExceptionTypes();

...然后执行declaredExceptions[0]的构造函数

但是当我在 Kotlin 中做类似的事情时,我似乎找不到 Java 接口中声明的异常:

val declaredExceptions = methodSignature.exceptionTypes

...给我一个空列表

问题:在拦截实现该接口的 Kotlin 类时,如何找到在 java 接口中声明的异常?

【问题讨论】:

  • 接口是 Java,不是 Kotlin。我想要的是从我的帖子中找出“SomeFault”。接口和 aspectJ 方面的实现在 Kotlin 中。
  • 如果我理解正确,您正在检查的是 Kotlin 子类的方法的签名。因此,如果您希望它具有声明的抛出异常,请使用 Throws。否则,不要检查该方法,而是检查 Java 接口的重写方法
  • 你是对的,我现在根据你的答案找到了一个解决方案,我只是错误地认为这在纯 Java 和 Java/Kotlin 混合世界中的工作方式相同。

标签: java kotlin


【解决方案1】:

根据JB的评论找到了解决办法:

Class.forName(methodSignature.declaringType.genericInterfaces[0].typeName).declaredMethods
.filter { method -> method.name == methodSignature.name }
.forEach { method -> method.exceptionTypes[0] <executed>}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多