如何获取由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方法或字段?

扩展函数和属性不会添加到现有的类中。 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一样获取它们作为方法。