是否有可能,如果可以,我该如何停止执行与 Java 的外部依赖关系中存在的方法,也许可以使用 AoP(即 AspectJ)之类的东西?
以这个场景为例:
外部代码:
class SomeForeignClass {
private Entity entity;
public void anApiMethod(String aString) {
entity.doSomethingWith(aString);
}
}
如果 anApiMethod
被调用,我希望我的应用程序能够通过某种监听器(这是我认为 AoP 可能派上用场的地方)并基于某些条件了解其调用要么允许它继续执行,要么接管控制权(例如,保存 aString 以供以后执行。)
目前我的理解是,要接近这样的东西,我需要 fork 现有的依赖项,进行自己的更改,然后依赖于我自己的 fork 。这是真的吗?
最佳答案
这不一定是真的。这取决于谁创建了 SomeForeignClass
的实例。如果您创建它们,或者可以重新注入(inject)它们的替代品,那么您可以扩展该类并让这个新类充当包装器。
SomeForeignClass sfc = getXX();
Wrapper w = new Wrapper(sfc);
setXX(w);
包装器在哪里
class Wrapper extends SomeForeignClass {
final SomeForeignClass sfc;
Wrapper(SomeForeignClass _sfc) {
sfc = _sfc;
}
@Override
void anApiMethod(String aString) {
if ( condition() )
sfc.anApiMethod(aString);
else
anAlternateMethod(aString);
}
/* ... etc ... */
}
如果实体
可以以某种方式检索,它可能会更简单一些,因为您不需要覆盖每个公共(public)成员,只需覆盖感兴趣的成员。
class Wrapper extends SomeForeignClass {
Wrapper(SomeForeignClass _sfc) {
super(_sfc.getEntity() );
}
@Override
void anApiMethod(String aString) {
if ( condition() )
super.anApiMethod(aString);
else
anAlternateMethod(aString);
}
}
但是仅仅因为有可能这样做并不意味着您应该这样做;依赖您自己的分支可能会更简单,至少在可以将更改推送到上游之前是这样。
关于java - 如何停止 Java 中外部方法的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48199487/