如何使用Byte Buddy从接口构建Java类的具体实现?
我有一个界面,假设它看起来像这样如何使用Byte Buddy从接口构建Java类的具体实现?,java,bytecode,byte-buddy,Java,Bytecode,Byte Buddy,我有一个界面,假设它看起来像这样 public interface TestObject { String getString(); Long getLong(); } 我想实际使用ByteBuddy构建这个对象的具体实现 这是我试过的 public class Runme { public static void main(String[] args) { ByteBuddy bb = new ByteBuddy(); Class
public interface TestObject {
String getString();
Long getLong();
}
我想实际使用ByteBuddy构建这个对象的具体实现
这是我试过的
public class Runme {
public static void main(String[] args) {
ByteBuddy bb = new ByteBuddy();
Class<?> clz = bb
.subclass(TestObject.class)
.method(any()).intercept(MethodDelegation.to(Interceptor.class))
.make()
.load(Object.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
try {
Object test = clz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public class Interceptor {
public Object intercept(@Origin String method, @AllArguments Object[] args) throws Throwable {
System.out.println("I have intercepted a call");
return "Hello";
}
}
我做错了什么++。。如果我想实现多个接口怎么办
我使用ByteBuddy来生成代码。问题是您正在通过
MethodDelegation.to(interceptor.class)
向拦截器的静态方法授权,而拦截器类只声明了非静态成员。您可以将拦截器方法声明为静态
,也可以委托给实例而不是类。我认为前者更合适
然而,单凭这一点仍然行不通。您正在从侦听器返回一个对象
类型,同时正在侦听any()
方法。这包括TestObject
接口的方法,也包括隐式超类Object
声明的方法。您可以按如下方式定义拦截器以使类编译,但Byte Buddy会将返回类型强制转换为每个方法的返回类型,这将导致ClassCastException
:
public class Interceptor {
@RuntimeType
public static Object intercept(@Origin String method, @AllArguments Object[] args) {
System.out.println("I have intercepted a call");
return "Hello";
}
}
非常感谢,还有一个问题,如何实现多个接口?您可以看看API文档:动态类型生成器有一个实现方法。感谢您的澄清。遇到类似的问题,通过更改:
.intercept(MethodDelegation.to(myRecycleServiceAdapterInterceptor.class))
到.intercept(MethodDelegation.to(new myRecycleServiceAdapterInterceptor())
;)
public class Interceptor {
@RuntimeType
public static Object intercept(@Origin String method, @AllArguments Object[] args) {
System.out.println("I have intercepted a call");
return "Hello";
}
}