使用 ByteBuddy 在 Android 中使用静态方法动态创建接口
Dynamically creating an Interface with static method in Android using ByteBuddy
我有这段代码,它在正常 Java 中与 byte buddy 一起工作正常,但它在 Android 中不起作用。
Class c = new ByteBuddy().makeInterface().name("TestInterface")
.defineMethod("test",String.class, Modifier.PUBLIC | Modifier.STATIC)
.intercept(FixedValue.value("Hello")).make()
.load(this.getClass().getClassLoader(),
new AndroidClassLoadingStrategy.Wrapping(context.getCacheDir())).getLoaded();
Object o = c.getMethod("test").invoke(c);
在 运行 之后 Android 我收到错误 Cannot define non-virtual method test for a pre-java 8 interface type
。
我实际上检查了 Android 版本 24 及更高版本支持静态方法的接口,但我认为问题是当您查询 Android for 'java.version' 属性 它 returns 0 这让字节小伙伴认为我们是旧版本的 JVM。
Byte Buddy 针对从平台上下文和 Android 推断的 Java 版本进行验证,这确实太严格了。您可以通过设置禁用验证:
new ByteBuddy().with(TypeValidation.DISABLED)
我有这段代码,它在正常 Java 中与 byte buddy 一起工作正常,但它在 Android 中不起作用。
Class c = new ByteBuddy().makeInterface().name("TestInterface")
.defineMethod("test",String.class, Modifier.PUBLIC | Modifier.STATIC)
.intercept(FixedValue.value("Hello")).make()
.load(this.getClass().getClassLoader(),
new AndroidClassLoadingStrategy.Wrapping(context.getCacheDir())).getLoaded();
Object o = c.getMethod("test").invoke(c);
在 运行 之后 Android 我收到错误 Cannot define non-virtual method test for a pre-java 8 interface type
。
我实际上检查了 Android 版本 24 及更高版本支持静态方法的接口,但我认为问题是当您查询 Android for 'java.version' 属性 它 returns 0 这让字节小伙伴认为我们是旧版本的 JVM。
Byte Buddy 针对从平台上下文和 Android 推断的 Java 版本进行验证,这确实太严格了。您可以通过设置禁用验证:
new ByteBuddy().with(TypeValidation.DISABLED)