0

我想拦截android视图类方法调用。例如,在视图类中有一个方法名称 getHeight()。因此,当从我的代码 obj.getHeight() 调用时,我想拦截它并希望返回一个任意值。

我可以拦截我自己的类方法调用。但不能用 android 视图类做到这一点。我正在使用使用 Byte Buddy 的 Android Buddy。所以这是我的代码

object ViewMethodInterceptor {

    @JvmStatic
    fun intercept(@SuperCall originalMethodCall: Runnable): Int  {
        Log.i("myTag", "Intercepted View Class getHeight ")
        return 500;
    }
}

这是 ViewTransformation 插件的代码。

@Transformation
class ViewTransformation : Plugin {

    override fun apply(
        builder: DynamicType.Builder<*>,
        typeDescription: TypeDescription,
        classFileLocator: ClassFileLocator
    ): DynamicType.Builder<*> {
        return builder.method(ElementMatchers.named("getHeight"))
            .intercept(MethodDelegation.to(ViewMethodInterceptor::class.java))
    }

    override fun matches(target: TypeDescription): Boolean {
        return target.isAssignableTo(View::class.java)
    }


    override fun close() {
        // Nothing to close
    }
}

我从 MainActivity 的 onCreate 方法调用 getHeight() 方法。

4

0 回答 0