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

我有以下单元测试:


@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() 方法时,此测试通过。当我将其保留为私有时,测试失败,因为我只能假设私有方法未正确委派。


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


蝴蝶刀刀
浏览 131回答 1
1回答

呼唤远方

不它不是。Byte Buddy 像javac一样生成字节码,并且该字节码必须有效才能运行。您不能从另一个类调用私有方法,因此,Byte Buddy 会抛出异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java