ByteBuddy:如何为接口生成Native修饰的实现方法?
解决方案
先纠正你代码里的关键问题,再给出完整实现:
- 方法匹配错误:你用
ElementMatchers.named("foo")匹配方法,但接口的目标方法是value(),需要改成named("value")。 - Native方法生成逻辑:ByteBuddy生成native方法不需要普通的拦截逻辑,直接用
Implementation.nativeMethod()即可,它会自动生成带native修饰符的空方法体。
另外,实现接口更规范的写法是implement(Foo.class)(subclass主要用于继承类),不过语法上两者都能运行。
完整代码如下:
final DynamicType.Unloaded<Foo> unloadedType = new ByteBuddy() .implement(Foo.class) .name("FooNative") .initializer(new LoadedTypeInitializer() { @Override public void onLoad(final Class<?> type) { System.loadLibrary("foo-native"); } @Override public boolean isAlive() { return true; } }) .method(ElementMatchers.named("value")) .intercept(Implementation.nativeMethod()) .annotateMethod(Override.class) // ByteBuddy通常会自动生成该注解,可按需保留 .make();
生成的类反编译后会得到你需要的代码:
public class FooNative implements Foo { static { System.loadLibrary("foo-native"); } @Override public native int value(); }
内容的提问来源于stack exchange,提问作者andreoss
相关产品推荐
相关产品推荐

