
今天在使用kotlin时遇到一个问题,代码如下:
@RouteNode(path = "/info", desc = "用户信息展示页面")
class UserActivity : Activity() {
@Autowired
var mUser: User = User()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//解析Autowired对应的属性内容
AutowiredService.Factory.getSingletonImpl().autowire(this)
setContentView(R.layout.activity_user)
val ft = fragmentManager.beginTransaction()
ft.replace(R.id.flContainer, UserFragment.newFragment(mUser.userName, mUser.userAge, mUser.userHobby))
ft.commitAllowingStateLoss()
}
}
程序编译时,解析Autowired
注解出错,报错信息如下:
e: 错误: [Router-Anno-Compiler]-- An exception is encountered, [The autowired fields CAN NOT BE 'private'!!! please check field [mUser] in class [basic.app.com.user.view.activity.UserActivity]]
mUser字段是private
修饰,What?
据我所知,Kotlin中,只要不显示添加访问权限修饰,默认都是public
,这里怎么会是private
呢。
然后翻阅资料,在Kotlin官网上找到解释:

原来如此,Kotlin类中默认的属性编译成class字节码的时候都会变成private类型,并且生成对应的getter和setter方法。如果字段以is
开头,如isOpen,那么setter方法会变成setOpen(xx: Any)
,getter方法会变成isOpen(): Any
,此处is开头的属性没有任何限制,不必一定为Boolean类型。
Instance Fields
通过JvmField
可以改变Property的访问权限,使得类的对象在外部可以访问该Property:

Static Fields
通过companion object + JvmField
可以把Property设置为静态属性:

通过object + lateinit
也可以把属性变为静态属性:

通过object + const
也可以把属性变为静态属性:

Static Method
说道这里,顺便讲一下怎么定义静态方法,两种方式,第一种和JvmField类似,使用companion object + JvmStatic
:

使用object + JvmStatic
来实现:

解决问题
在mUser字段上加上@JvmFiled
,成功解决问题了。
参考文章
https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
网友评论