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