首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KotlinPoet:向现有类添加函数

KotlinPoet:向现有类添加函数
EN

Stack Overflow用户
提问于 2018-12-16 20:21:11
回答 1查看 1.3K关注 0票数 0

我想要构建一个注释处理器,它生成私有“可变类”字段的公共“非可变类”getter函数(例如返回LiveData版本的MutableLiveData字段)。

我想写的是:

代码语言:javascript
复制
class MyClass {  
    @WithGetNonMutable  
    private val popup: MutableLiveData<PopupTO?> = MutableLiveData()  
}

我想要产生的

代码语言:javascript
复制
class MyClass {  
    private val popup: MutableLiveData<PopupTO?> = MutableLiveData()  
    fun getPopup(): LiveData<PopupTO?> = popup  
}

用正确的返回类型生成函数没有问题:

代码语言:javascript
复制
val liveDataType = ClassName("android.arch.lifecycle", "LiveData")
val returnType = liveDataType.parameterizedBy(genericDataType)

val function = FunSpec.builder("get${element.simpleName}")
                .addModifiers(KModifier.PUBLIC)
                .addStatement("return ${element.simpleName}")
                .returns(returnType)
                .build()

问题是变量(popup)是私有的,因此要访问它,我生成的函数也需要是该类的一部分(它不能是一个新文件中的简单扩展函数)。KotlinPoet示例全部写入新文件--但是没有访问私有字段的方法(或者有吗?)因此,我需要在实际的类文件中编写函数吗?我怎样才能做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-01-11 16:31:20

注释处理器不能修改现有代码,它们只能生成新代码.

也就是说,您可以修改您的方法,生成一个扩展函数而不是一个成员函数。

  1. 保持MyClass (将private修饰符更改为internal):
代码语言:javascript
复制
class MyClass {  
    @WithGetNonMutable  
    internal val popup: MutableLiveData<PopupTO?> = MutableLiveData()  
}
  1. 生成一个新文件(在同一个包中),其内容如下:
代码语言:javascript
复制
fun MyClass.getPopup(): LiveData<PopupTO?> = this.popup  

如果您完全不能修改MyClass (您不能将private更改为internal),则可以(它并不那么优雅,但您可以这样做):

在生成的扩展函数中,使用Reflection访问私有字段。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53806135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档