Байт Бадди - Как делегировать приватный метод? - PullRequest
1 голос
/ 04 июля 2019

У меня есть следующий модульный тест:

@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!";
    }
}

Когда я делаю метод getHello () общедоступным в классе Foo, этотест проходит.Когда я оставляю его закрытым, тест не проходит, поскольку я могу только предположить, что закрытый метод не делегирован должным образом.

Возможно ли даже делегировать закрытый метод другому классу?

Спасибо!

1 Ответ

0 голосов
/ 05 июля 2019

Нет, это не так.Byte Buddy генерирует байт-код точно так же, как javac , и этот байт-код должен быть действительным.Вы не можете вызывать закрытый метод из другого класса, поэтому Byte Buddy вызывает исключение.

...