使用 ByteBuddy 重新定义方法
Redefine methods with ByteBuddy
我正在尝试使用 ByteBuddy 重新定义一些方法。
当我使用 FixedValue.value() 拦截方法时,没问题。
但是使用拦截器拦截方法,编译器会抛出 UnsupportedOperationException。
我想覆盖“Foo.nothing()”方法来打印一些东西。
public class Foo {
public String getHello() {
return "not redefined hello!";
}
public String getBye() {
return "not redefined Bye!";
}
public void nothing() {}
}
这是我的拦截器:
public class GeneralInterceptor {
@RuntimeType
public Object intercept(@AllArguments Object[] allArguments,
@Origin Method method) {
System.out.println("asdfasdf");
return null;
}
}
这是我重新定义的代码
public class RedefineTest {
ClassReloadingStrategy classReloadingStrategy;
@BeforeEach
public void init() {
ByteBuddyAgent.install();
classReloadingStrategy = ClassReloadingStrategy.fromInstalledAgent();
}
@Test
public void redefineTest() {
// okay
new ByteBuddy()
.redefine(Foo.class)
.method(named("getHello"))
.intercept(FixedValue.value("ByteBuddy Hello!"))
.make()
.load(Foo.class.getClassLoader(), classReloadingStrategy);
// error
new ByteBuddy()
.redefine(Foo.class)
.method(named("nothing"))
.intercept(MethodDelegation.to(new GeneralInterceptor()))
.make()
.load(Foo.class.getClassLoader(), classReloadingStrategy);
Foo foo = new Foo();
System.out.println(foo.getHello());
System.out.println(foo.getBye());
foo.nothing();
}
}
我解决了!
public class GeneralInterceptor {
@RuntimeType
public static Object intercept(@AllArguments Object[] allArguments) {
System.out.println("asdfasdf");
return null;
}
}
并改变
intercept(MethodDelegation.to(new GeneralInterceptor())
至
intercept(MethodDelegation.to(GeneralInterceptor.class)
我正在尝试使用 ByteBuddy 重新定义一些方法。 当我使用 FixedValue.value() 拦截方法时,没问题。 但是使用拦截器拦截方法,编译器会抛出 UnsupportedOperationException。
我想覆盖“Foo.nothing()”方法来打印一些东西。
public class Foo {
public String getHello() {
return "not redefined hello!";
}
public String getBye() {
return "not redefined Bye!";
}
public void nothing() {}
}
这是我的拦截器:
public class GeneralInterceptor {
@RuntimeType
public Object intercept(@AllArguments Object[] allArguments,
@Origin Method method) {
System.out.println("asdfasdf");
return null;
}
}
这是我重新定义的代码
public class RedefineTest {
ClassReloadingStrategy classReloadingStrategy;
@BeforeEach
public void init() {
ByteBuddyAgent.install();
classReloadingStrategy = ClassReloadingStrategy.fromInstalledAgent();
}
@Test
public void redefineTest() {
// okay
new ByteBuddy()
.redefine(Foo.class)
.method(named("getHello"))
.intercept(FixedValue.value("ByteBuddy Hello!"))
.make()
.load(Foo.class.getClassLoader(), classReloadingStrategy);
// error
new ByteBuddy()
.redefine(Foo.class)
.method(named("nothing"))
.intercept(MethodDelegation.to(new GeneralInterceptor()))
.make()
.load(Foo.class.getClassLoader(), classReloadingStrategy);
Foo foo = new Foo();
System.out.println(foo.getHello());
System.out.println(foo.getBye());
foo.nothing();
}
}
我解决了!
public class GeneralInterceptor {
@RuntimeType
public static Object intercept(@AllArguments Object[] allArguments) {
System.out.println("asdfasdf");
return null;
}
}
并改变
intercept(MethodDelegation.to(new GeneralInterceptor())
至
intercept(MethodDelegation.to(GeneralInterceptor.class)