java - 如何停止 Java 中外部方法的执行?

标签 java

是否有可能,如果可以,我该如何停止执行与 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/

相关文章:

Java Swing 窗口大小与 AWT Canvas 结果不匹配

java - .NET 世界是否有 Maven 替代方案或端口?

java - 将反射与 Realm 结合使用 (Android)

Java 或 Groovy 相当于 python for loop + izip

java - JSlider 抛出 illegalArgument 异常 :invalid range properties

java - 从 Mule 端点捕获错误 java 响应

java - 在保存 Spring Data MongoDB 实体之前对 MongoDB 文档进行后处理

java - log4j2 - StatusLogger 未找到 Log4j 2 配置文件。使用默认配置

java - 为什么这个 DataOutputStream 在我的名字后面打印乱码?

Java/Android - GettingClassCast 异常将基类转换为子类以调用子类方法