字节好友-如何委派私有方法?

时间:2019-07-04 19:05:43

标签: java methods private delegation byte-buddy

我有以下单元测试:

@Test
public void TestPrivateMethodDelegation() throws InstantiationException, IllegalAccessException, IllegalArgumentException, 
    InvocationTargetException, NoSuchMethodException, SecurityException
{
    Foo foo = new ByteBuddy()
        .subclass(Foo.class)
        .method(named("getHello")
            .and(isDeclaredBy(Foo.class)
            .and(returns(String.class))))
        .intercept(MethodDelegation.to(new Bar()))
        .make()
        .load(Foo.class.getClassLoader(), ClassReloadingStrategy.fromInstalledAgent())
        .getLoaded()
        .getDeclaredConstructor().newInstance();

    Method privateMethod = Foo.class.getDeclaredMethod("getHello");
    privateMethod.setAccessible(true);

    assertEquals(privateMethod.invoke(foo), new Bar().getHello());
}

这是它使用的类:

@NoArgsConstructor
public class Foo 
{
    @SuppressWarnings("unused")
    private String getHello()
    {
        return "Hello Byte Buddy!";
    }
}

@NoArgsConstructor
public class Bar 
{
    public String getHello()
    {
        return "Hello Hacked Byte Buddy!";
    }
}

当我在Foo类中公开getHello()方法时,此测试通过。当我将其设置为私有时,由于只能假定未正确委派私有方法,因此测试失败。

是否甚至可以将私有方法委托给另一个类?

谢谢!

1 个答案:

答案 0 :(得分:0)

不,不是。字节伙伴会像 javac 一样生成字节代码,并且此字节代码必须有效才能起作用。您不能从另一个类调用私有方法,因此Byte Buddy抛出异常。