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
-
不幸的是,我没有能力更改库内部结构(“将方法执行委托给另一个类”)。否则将是微不足道的。
-
你误会我了。您拦截原始方法调用并将其委托给另一个类。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/267527.html