Tag: 反思

如何在kotlin中反射设置委托属性值?

我的实体类: class User : ActiveRecord<User>() { var name by Column(String.javaClass); var id by Column(Int.javaClass); } 现在我想通过反思设置名字值: var clazz = User().javaClass var record = clazz.newInstance() var field = record.getDeclaredField(it + "$" + "delegate") field.set(record,"aa") 然后错误: entity.Column field ActiveRecord4k.User.name$delegate to java.lang.String 如何做到这一点? TY!

Kotlin:如何访问Delegate的get-和setValue方法?

我一直想知道如何委托属性 (“由”的关键字)的工作。 我通过契约得到了委托(“by”的右边)必须实现一个get和setValue(…)方法,但是怎样才能确保编译器以及如何在运行时访问这些方法呢? 我最初的想法是,很明显,代表们必须实施某种“SuperDelegate” – 接口,但似乎并非如此。 所以剩下的唯一选择就是使用Reflection来访问这些方法,可能在语言本身的低层实现。 我觉得有些奇怪,因为根据我的理解,这将是相当低效的。 此外,反射API甚至不是stdlib的一部分,这使得它更怪。 我假设后者已经是(部分)答案。 所以让我再问你下面的问题:为什么没有声明getter和setter方法的SuperDelegate-Interface? 那不会更清洁吗? 以下对于这个问题并不重要 所描述的接口甚至已经在ReadOnlyProperty和ReadWriteProperty中定义了。 要决定使用哪一个可以取决于我们是否有val / var。 或者甚至省略,因为在val上调用setValue方法被编译器阻止,只能使用ReadWriteProperty接口作为SuperDelegate。 可以说,当要求代表实现某个接口的时候,构造会变得不那么灵活。 虽然这会假定作为代表使用的类别可能不知道这样使用,但是由于必要的方法的具体要求,我认为这是不太可能的。 如果你仍然坚持,这里有一个疯狂的想法:为什么不甚至使这个类通过扩展实现所需的接口(我知道这是不可能的,但现在,但是,为什么不呢?可能有一个好的'为什么不',请让我知道作为一个旁注)。

我怎样才能得到Kotlin物业的名字?

我有以下功能访问属性的代表。 它使用Kotlin反射来获得一个属性的名称和Java反射来获得该字段。 fun Any.getDelegate<T>(prop: KProperty<T>): Any { return javaClass.getDeclaredField("${prop.name}\$delegate").let { it.setAccessible(true) it.get(this) } } 该方法是这样使用的: val delegate = a.getDelegate(A::b) 不过,我宁愿像这样使用它: val delegate = abdelegate 上面代码的问题是获取ab的属性名称并从ab获取实例。 根据我对Kotlin的了解,这可能是不可能的,但是我想看看我是否可以清理我的功能。 为了更全面地了解我正在尝试做什么,这里是我的完整代码。 我想要一个可观察的委托,我可以添加和删除观察员使用委托参考,而不创建额外的变量。 fun Any.addObservable<T>(prop: KProperty<T>, observer: (T) -> Unit) { getObservableProperty(prop).observers.add(observer) } fun Any.getObservableProperty<T>(prop: KProperty<T>): ObservableProperty<T> { return getDelegate(prop) as ObservableProperty<T> } fun Any.getDelegate<T>(prop: KProperty<T>): Any { return javaClass.getDeclaredField("${prop.name}\$delegate").let […]