Kotlin Property访问权限


Kotlin Property访问权限_第1张图片
image.png

今天在使用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 Property访问权限_第2张图片
image.png

原来如此,Kotlin类中默认的属性编译成class字节码的时候都会变成private类型,并且生成对应的getter和setter方法。如果字段以is开头,如isOpen,那么setter方法会变成setOpen(xx: Any),getter方法会变成isOpen(): Any,此处is开头的属性没有任何限制,不必一定为Boolean类型。

Instance Fields

通过JvmField可以改变Property的访问权限,使得类的对象在外部可以访问该Property:

Kotlin Property访问权限_第3张图片
image.png

Static Fields

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

Kotlin Property访问权限_第4张图片
image.png

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

Kotlin Property访问权限_第5张图片
![image.png](https://upload-images.jianshu.io/upload_images/9942787-f0937599312ceead.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

Kotlin Property访问权限_第6张图片
image.png

Static Method

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

Kotlin Property访问权限_第7张图片
image.png

使用object + JvmStatic来实现:

Kotlin Property访问权限_第8张图片
image.png

解决问题

在mUser字段上加上@JvmFiled,成功解决问题了。

参考文章

https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields

你可能感兴趣的:(Kotlin Property访问权限)