关于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

  • 您也可以将 Javassist 与 Java 7 和 8 一起使用。此外,我的代理出现错误,直到我在清单中添加了一个额外的参数,正如我在这个问题的答案中提到的那样:stackoverflow.com/questions/10423319/…


你可以用 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());

}

  • 如果在类的构造函数中调用包私有方法(在您的示例中:如果 Foo 调用 foo()),这也会起作用吗?
  • 不,不会的。如果可能的话,我会建议重新考虑设计。
  • 这是一个我无法轻易修改的第 3 方库。


n


n


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

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

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

  • 不幸的是,我没有能力更改库内部结构(“将方法执行委托给另一个类”)。否则将是微不足道的。
  • 你误会我了。您拦截原始方法调用并将其委托给另一个类。


来源:https://www.codenong.com/20161210/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9451.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?