Kotlin中的java反射foo.getClass().getFields()
是否相同?当我知道它的名字时,我只能发现我可以访问某个字段,但我想以通用的方式处理字段。
答案 0 :(得分:9)
你想要字段as-in"支持字段"或者"属性" ...... Kotlin真的只有属性。你可以使用以下方法获得这些课程:
MyTest::class.memberProperties
// or
MyTest::class.declaredMemberProperties
从Java Class<T>
开始,使用kotlin
扩展名属性来获取可以继续使用的Kotlin KClass<T>
:
someClassOfMine.javaClass.kotlin.memberProperties
这需要将kotlin-reflect
依赖项添加到构建和类路径中。您会在KClass
对于属性背后的秘密支持字段,使用Java反射需要您自担风险。
答案 1 :(得分:2)
简单的答案
在你的 build.gradle (app) 文件中
implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version")
然后
val fields = YourClass::class.declaredMemberProperties
for (i in fields){
Log.e("Fields ===", i.name)
}
干杯!!!
答案 2 :(得分:1)
你不能在Kotlin中这样做,但在java中有一种肮脏的不可靠的方法。你可以使用java反射。像这样:
public class TestClass {
trait EmptyTrait
class EmptyClass
public var anotherVar:Int? = null
public val contant:Float = 10f
private var emptyTrait:EmptyTrait? = null
val emptyClass:EmptyClass = EmptyClass()
public fun setVal(fieldName: String, value: Int) {
javaClass.getDeclaredField(fieldName).set(this, value);
}
public fun getFieldNames(): String {
return javaClass.getDeclaredFields().map{it.getName()}.join(", ")
}
}
让我们测试一下:
val t = TestClass()
Log.v("MainActivity", "Fields: " + t.getFieldNames())
Log.v("MainActivity", "anotherVar: " + t.anotherVar)
t.setVal("anotherVar", 10)
Log.v("MainActivity", "anotherVar: " + t.anotherVar)
结果:
Fields: anotherVar, emptyClass, emptyTrait, contant, $kotlinClass
anotherVar: null
anotherVar: 10
它有效)
答案 3 :(得分:0)
使用Kotlin v1.1非常简单,您可以使用以下方法获取kotlin中的字段
val fields = MyClass.javaClass.kotlin.members
MyClass是您选择的课程。
为了使用它,你需要在你的gradle构建文件中包含kotlin-reflect,如下所示
compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
此外,如果你需要java字段,也可以直接从javaClass中获取字段(在某些情况下很有用,因为它们覆盖的范围略有不同)
val fields = MyClass.javaClass.declaredFields
答案 4 :(得分:0)
Kotlin 中有一种方法可以工作,而不必在项目中添加新的依赖项:
假设有一个名为Mine
的自定义类
class Mine(var prop:String) {
fun myMethod():Boolean {
return true
}
}
名为isMethod
fun isMethod(t:Any, s:String):Boolean {
try {
t.javaClass.getMethod(s) // or t::class.java.getMethod(s)
return true
} catch(e:Exception) {
return false
}
}
在声明一个Mine
实例并对其进行测试之后。
fun main() {
var m = Mine("Paulo")
println(isMethod(m, "myMethod")) // it prints true
println(isMethod(m, "otherMethod")) // it prints false
}
答案 5 :(得分:0)
像这样:
User::class.memberProperties.forEach { member ->
log.i("${member.name} -> ${member.get(this)}")
}
效果很好