Tag: 反射

Kotlin反射 – 获取一个类的所有字段名称

我怎样才能得到一个Kotlin数据类的declaredFields它的declaredFields ? 像Java的getDeclaredFields() 如果这是可能的,是否也可以过滤public和private领域? (像Java的Modifier.isPrivate(field.getModifiers()) )

如何获得Kotlin的KType?

我正在尝试Kotlin中的反射功能,但似乎无法理解如何获取KType值。 假设我有一个将短语映射到对象工厂的类。 在不明确的情况下,用户可以提供一个type参数,将搜索范围缩小到仅返回该类型对象(或某个子类型)的工厂。 fun mapToFactory(phrase: Phrase, type: KType = Any::class): Any {…} type需要接受几乎任何东西,包括Int ,这从我的经验似乎有点特别对待。 默认情况下,它应该是Any东西,这意味着“不排除任何工厂”。 如何分配默认值(或任何值)来type ?

用Kotlin反射调用类的构造函数

我有以下的数据类 data class Person (val id: Int? = null, val name: String, val active: Boolean) 我需要通过反射来调用它的构造函数。 我试了下面的代码 private fun <T> createEntity(constructor: Constructor<*>, vararg args: T) : Any { return constructor.newInstance(args) } 并用args参数的一个数组来调用它。 val fields = entity.declaredFields var elements = Array<Any>(getFieldsCount(fields), { i -> val index = cursor.getColumnIndex(fields[i].name.toUpperCase()) when (fields[i].type) { kotlin.Int::class.java -> cursor.getInt(index) kotlin.Boolean::class.java -> […]

在Kotlin中通过反思调用方法的习惯性方法

我有一段Kotlin代码试图反思地调用一个使用Java的Reflection包的方法: val arguments = arrayOfNulls<Any>(numberOfParams) // Populate arguments try { fooMethod.invoke(fooClass, arguments) } catch (e: Exception) { // Panic } 它保持与“错误的参数数量IllegalArgumentException”失败。 我在这个问题上做了一些阅读,看来invoke()方法的spread操作符拒绝拆开Array<Any>因为它不等于Object[] 。 我可以尝试使用来自Java的标准Object[] ,但这让我怀疑,这是唯一的方法吗? 这是最好的方法吗? 有什么方法可以用Kotlin的类型来做到这一点? 什么是最实现的方式来达到我想要的Kotlin?

Kotlin:可转让的“它”?

我试图简化Kotlin中的Parcelable代码: public class C() : Parcelable { var b1: Boolean = false var b2: Boolean = false var b3: Boolean = false var i1: Int = 0 var i2: Int = 0 val parcelBooleans = listOf(b1, b2, b3) val parcelInts = listOf(i1, i2) override fun writeToParcel(p: Parcel, flags: Int) { parcelBooleans.forEach { p.writeBoolean(it) } parcelInts.forEach […]

Kotlin阶级平等失败

以下片段显示了从不同来源获得的Kotlin KClass参考的测试相等性的结果。 他们的字符串表示是相同的。 但是他们的java类是不同的。 预计c , c0和c1是相等的。 但由于某种原因,他们不是。 有一些细微差别,或者是一个错误? 如果这不是一个错误什么是可靠的方法来测试KClass es的平等? fun main(args: Array<String>) { val c = Int::class fun test(v0: Any, v1: Any) { val c0 = v0.javaClass.kotlin val c1 = v1.javaClass.kotlin println("c= $c; c0= $c0; c1= $c1") // c= class kotlin.Int; c0= class kotlin.Int; c1= class kotlin.Int println("c= ${c.java}; c0= ${c0.java}; c1= ${c1.java}") […]

kotlin别名属性代表抛出异常

我想将别名属性添加到kotlin中的一些类,这些类只是将自己委托给一些已有的属性 那么我发明了一个名为别名的方法来做到这一点,不幸的是会导致一个异常 val <T> Array<T>.length by alias(Array<T>::size) val <T> Collection<T>.length by alias(Collection<T>::size) fun <R, T> alias(alias: KProperty1<R, T>) = object : ReadOnlyProperty<R, T> { override operator fun getValue(thisRef: R, property: KProperty<*>): T { return alias.get(thisRef) } } 在异常堆栈之后 java.lang.NoSuchMethodError: [Ljava.lang.Object;.getSize()I at kt.ruby.ArrayKt$length$2.get(Array.kt:34) at kt.ruby.ArrayKt$alias$1.getValue(Array.kt:40) at kt.ruby.ArrayKt.getLength(Array.kt)

访问没有实例的Kotlin委托类型

我已经阅读Kotlin中访问属性委托,这是关于从实例访问委托。 可以从Kotlin 1.1开始使用KProperty::getDelegate ,但是这将返回委托的实例,因此需要先创建一个类的实例。 现在我想获得委托的类型,而没有类的实例。 考虑一个具有自定义委托类型CustomDelegate的库,它需要获取委托给CustomDelegate实例的类的所有属性: class Example { var nonDelegatedProperty = "I don't care about this property" var delegatedProperty1 by lazy { "I don't care about this too" } var delegatedProperty2 by CustomDelegate("I care about this one") } 我怎么能,因为我有KClass<Example> ,但不是一个例子的Example ,获取委托给CustomDelegate所有属性?

如何从Java获取Kotlin属性的注释?

我有一个kotlin类,其属性有一个Java注释,但是我不能使用Java反射来获取这些注释: class TestClass(@A var myProperty : String) 以下测试打印null: public class TestKotlinField { @Retention(RetentionPolicy.RUNTIME) public @interface A{} @Test public void test() throws NoSuchFieldException { System.out.println(TestClass.class.getDeclaredField("myProperty").getAnnotation(A.class)); } } 我怎样才能得到一个给定的kotlin属性的注释?

Kotlin绑定可调用的引用不一致

今天我在Android应用程序中为我的Presenter创建了单元测试,并且发现了一些绑定可调用引用的不一致性。 它正在开发还是语言错误? 我发现在kotlin 1.1中支持可调用引用。 但是我的代码与kotlin 1.1.2-4失败。 在我的演示者类中,测试方法从数据库读取数据,而dao.getAllItems()方法没有参数,而视图需要列表 – > view.showData(List<Item>) 。 我正在使用Mockito,RxJava2和Room Persistance库。 class ItemsPresenter @Inject constructor(private val itemDao: ItemDao) : Presenter<ItemsView> { val TAG = this.javaClass.name!! private val disposables: CompositeDisposable = CompositeDisposable() private lateinit var view: ItemsView override fun onCreate(view: ItemsView) { this.view = view } override fun onDestroy() { disposables.clear() } fun onGetItems() […]