关于java:添加代码封装私有库方法

Add code to package private library method

我有一个带有包私有方法的库类。通过子类直接覆盖此方法是没有选择的。当从库内部调用此包私有方法时,无论多么丑陋,是否有任何方法可以执行自己的代码,例如使用 AspectJ?

这是该类的简化示例(packagePrivateMethod() 实际上不是直接调用的,而是从本机代码调用的):

1
2
3
4
5
6
7
8
9
10
11
12
13
public LibClass {

  public LibClass() {
    ...
    packagePrivateMethod();
    ...
  }

  void packagePrivateMethod() {
    // <-- here I want to execute additional code
    ...
  }
}


n


你可以用 Mockito 或类似的模拟库来模拟一个包私有方法。示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// declared in a package
public class Foo {
    String foo(){
        return"hey!";
    }
}

@Test
public void testFoo() throws Exception {
    Foo foo = Mockito.spy(new Foo());

    Assert.assertEquals("hey!", foo.foo());

    Mockito.when(foo.foo()).thenReturn("bar!");

    Assert.assertEquals("bar!", foo.foo());

}


n


n


您可以将 Spring 添加到您的项目中吗?
可能可以使用 ProxyFactory - 请参阅另一个 SO post

使用 ProxyFactory,您可以为类实例添加建议并将方法执行委托给另一个类(执行 packagePrivateMethod() 和/或用您想要的代码替换它)。

由于该库不是弹簧管理的,您可能必须使用带有弹簧的加载时编织:ltw xml