Java ByteBuddy-无法从超类截获静态方法

Java ByteBuddy-无法从超类截获静态方法,java,android,byte-buddy,Java,Android,Byte Buddy,我正在为Android开发命令行工具(想想am),试图利用ByteBuddy的强大功能来存根在Android.security.KeyStore中定义的静态方法getApplicationContext 但是-当对android.security.KeyStore进行子类化时,ByteBuddygetDeclaredMethods似乎看不到该方法,因此无法拦截它 使用反射API中的getMethods时,我可以列出方法 classandroidkeystore=Class.forName(“an

我正在为Android开发命令行工具(想想am),试图利用ByteBuddy的强大功能来存根在Android.security.KeyStore中定义的静态方法getApplicationContext

但是-当对android.security.KeyStore进行子类化时,ByteBuddygetDeclaredMethods似乎看不到该方法,因此无法拦截它

使用反射API中的getMethods时,我可以列出方法

classandroidkeystore=Class.forName(“android.security.KeyStore”);
方法[]keyStoreMethods=new ByteBuddy()
.with(TypeValidation.DISABLED)
.subclass(AndroidKeyStore、ConstructorStrategy.Default.Simulation\u SUPER\u类)
.名称(“KeyStoreMasker”)
.method(ElementMatchers.named(“getApplicationContext”))
.intercept(SuperMethodCall.INSTANCE)
.make()
.load(getClass().getClassLoader(),
新的AndroidClassLoadingStrategy
.Injecting(新文件(“/data/app/cmdutil”))
.getLoaded()
.getDeclaredMethods();
对于(i=0;i
当运行上面的方法时,我希望在子类中有一个方法-getApplicationContext。但是,子类不包含任何方法

getMethods替换对getDeclaredMethods的调用,我可以列出超类的所有公共方法

通过将截取的方法替换为非静态方法(例如“state”),我可以使用ByteBuddy的getDeclaredMethods函数列出该方法:

keyStoreMethods中声明的方法数:2

method=public android.security.KeyStore$State AndroidKeyStoreMasker.State()

方法=public android.security.KeyStore$State AndroidKeyStoreMasker.State(int)

所以我的最终结论是ByteBuddy(或者我的ByteBuddy用例)在静态方法可见性方面存在一些问题

参考android.security.KeyStore.java:


任何帮助都会非常有用。

当创建
子类时,Byte Buddy只能拦截由子类或超类的虚拟方法直接声明的方法。JVM就是这样工作的,
静态
方法直接在接收器上调度


Byte Buddy也能够重新定义和重新转换现有的类,但这需要一个Java代理,而Android上没有。因此,我担心您需要找到一个非静态的挂钩点来完成您正在尝试的工作。或者,查看
成员替换
,您可以从代码中重定向此类调用。这也需要重新传输,但由于它发生在代码中,您可以使用Byte Buddy的构建插件。

感谢您的响应。由于我没有任何无静态钩子点的选项,所以我选择了你的第二个产品——使用bytebuddy的Maven构建插件。但是-由于我的代码中没有定义被调用类的方法,也没有被反射引用,所以我不知道如何利用您的建议。
android.security.KeyStore类在构建时不可用。那么-我遗漏了什么?您需要替换代码中调用有问题的方法的调用。这可以在构建时完成。