我目前正在将一些Java RMI代码移植到Kotlin。 Java中的遗留接口是:
interface Foo: Remote {
Bar getBar() throws RemoteException
}
运行自动迁移工具后,字段bar
将更改为属性:
interface Foo: Remote {
val bar: Bar
}
但是,在迁移的程序中,getBar
不再标记为throws RemoteException
,这会导致RMI调用中出现illegal remote method encountered
错误。
我想知道有没有办法将@Throws
标记为某个属性?
答案 0 :(得分:4)
好吧,如果你看一下@Throws
:
如果有一个特定的getter不使用支持字段,只需直接注释:
val bar: Bar
@Throws(RemoteException::class) get() = doSomething()
@Throws
的有效目标是
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER,
AnnotationTarget.CONSTRUCTOR
因此,在其他情况下,您需要定位getter本身而不是属性:
@get:Throws(RemoteException::class)
The full list of supported use-site targets是:
- 文件;
- 属性(具有此目标的注释对Java不可见);
- 字段;
- get(property getter);
- set(property setter);
- 接收器(扩展功能或属性的接收器参数);
- param(构造函数参数);
- setparam(属性设置器参数);
- delegate(存储委托属性的委托实例的字段)。
@get
指定此注释将应用于getter。
您的完整界面将是
interface Foo: Remote {
@get:Throws(RemoteException::class)
val bar: Bar
}
这是一个问题 - 在生成的代码中,是没有生成throws
子句。我觉得这可能是一个错误,因为注释明确标记为针对这四个使用网站。 CONSTRUCTOR
和FUNCTION
肯定有用,它只是没有生成的属性。
我看了一下Kotlin编译器试图找到一个可能的原因,我找到了this:
interface ReplStateFacade : Remote {
@Throws(RemoteException::class)
fun getId(): Int
...
}
为了使用@Throws
,有趣地避免使用属性。
也许这是一个已知的解决方法?