如何获取由javareflection在kotlin扩展中声明的属性或函数

如果我这样在Kotlin中声明扩展函数或扩展属性

var View.newPosition: Int get():Int { return newPosition } set(value) { this.newPosition=value Log.e("test","newPosition"+newPosition) } fun View.setPosition(value:Int ){ Log.e("test", "Position" + value) } 

然后我想通过这样的Javareflection来获取它们

  Class stuClass = null; try { stuClass = Class.forName("android.view.View"); } catch (Exception e) { Log.e("test", e.toString()); } Field f = null; try { f = stuClass.getField("newPosition"); } catch (Exception e) { Log.e("test", e.toString()); } Object obj = null; try { obj = stuClass.getConstructor().newInstance(); } catch (Exception e) { Log.e("test", e.toString()); } try { f.set(obj, 555); } catch (Exception e) { Log.e("test", e.toString()); } try { Method setPosition = stuClass.getDeclaredMethod("setPosition", int.class); setPosition.setAccessible(true); try { setPosition.invoke(obj, 20); } catch (Exception e) { Log.e("test", e.toString()); } } catch (Exception e) { Log.e("test", e.toString()); } 

但我只是得到一些错误说

 NoSuchFieldException: newPosition NoSuchMethodException:  [] NoSuchMethodException: setPosition [int] 

所以我想知道是否我的代码写在一个错误的方式,或者我们不能得到kotlin扩展属性或function通过Javareflection像普通的Java方法或字段?

One Solution collect form web for “如何获取由javareflection在kotlin扩展中声明的属性或函数”

扩展函数和属性不会添加到现有的类中。 Kotlin编译器允许你引用它们,因为它们是类的一部分。

如果您在Kotlin中写入一个名为“Funs.kt”的Kotlin文件中的函数“setPosition”:

 //in file Funs.kt fun View.setPosition(value: Int) { //smth } 

编译器将使它成为一个FunsKt.class里面的静态方法“setPosition”。

 public final class FunsKt { public static void setPosition(View $receiver, int value) { //smth } } 

这只是Kotlin编译器的魔力,它允许你使用它,就好像它是View类的一部分(注意,因为你不能从扩展function访问私有/保护值)。 从Java你必须使用它,因为它是。

要获得Method setPosition,请执行以下操作:

 Class c = Class.forName("[your package].[kotlin file name + "Kt"]"); Method m = c.getMethod("setPosition", View.class, int.class); 

扩展属性以类似的方式工作。 没有创建真正的variables – 只有两个静态方法(getter和setter)。 这些方法没有存储值的实际variables,但是他们在旅途中计算这个值。 你不能以Field对象的forms获取它们,但是你可以像setPosition一样获取它们作为方法。

  • Kotlin:如何创建一个Stringtypes的二维数组
  • android studio如何将java转换为kotlin文件
  • 为什么解构声明不能用在expression式中?
  • Kotlin Lambda不在内部调用代码
  • 扩展Java类时,处理Kotlin中的空情况的最佳方法是什么?
  • 当对象应该返回自己的修改副本时,是否有可能避免代码重复?
  • Kotlin monad:重构一个构造函数来处理CPS
  • Java的互操作性:如何在Kotlin中声明一个编译时数组常量?
  • 如何将实现委托给Kotlin中的一个属性?
  • 引用扩展function?
  • Kotlin - 排序地图集合
  • Kotlin language will be the best programming language for Android.