代码之家  ›  专栏  ›  技术社区  ›  Diego Dias

Java类回调函数在每类方法中的应用

  •  3
  • Diego Dias  · 技术社区  · 15 年前

    在Java中,有没有办法在我的类的每一个方法中调用一个回调函数,而不必显式地调用??

    我不想这么做

    public void foo()
    {
       //some code
       callBackFunction()
    } 
    

    我想去做

    public void foo()
    {
       //some code
    } 
    

    然后类识别出它必须调用回调函数()。

    4 回复  |  直到 15 年前
        1
  •  8
  •   Simon    10 年前

    可以使用反射在运行时检查类,并使用所谓的“动态代理”对象包装类的所有方法。看看这位官员 Java documentation on reflection 例如(在该页面中搜索“debugproxy”,它实际上实现了一个用于输入和离开每个方法的回调)。

        2
  •  8
  •   Benjamin Cox    15 年前

    面向方面编程是以半全局方式实现这一点的最简单方法。要么使用 AspectJ 直接使用,或使用IOC容器如弹簧 supports aspects .

    实际上,您可以做的是定义“切入点”,这是一种表达源代码中执行其他操作的位置的方法。您可以在方法实现之前、之后或代替现有方法实现执行该操作(如调用callbackFunction())。

    这里还有许多其他有用的特性,不过要注意,如果使用过度,可能会导致非常难以调试代码。

        3
  •  1
  •   Bozho    15 年前

    你可以用AOP- AspectJ 例如,但是要注意,有一个陡峭的学习曲线

        4
  •  1
  •   saleemshafi    15 年前

    其他几个人已经提到了AOP和AspectJ。如果您不想使用AspectJ,但仍然需要一些AOP功能, Spring 可以帮助您实现它。

    为了使这项工作顺利进行,您应该对接口进行编码,因此Spring可以轻松地使用Java代理来注入AOP行为。所发生的是,您得到了接口的另一个实现,它将调用委托给“真正的”实现,并在方法调用之前和/或之后添加了一些额外的工作。

    坦率地说,您可以在没有代理或Spring的情况下完成这项工作,只需手工编写一个新的实现,例如

    public void foo() {
        callbackFunction();
        this.delegate.foo();
    }
    

    其中this.delegate是“真正的”impl,但您的客户机最终调用了 foo() 上述方法。

    ...
    IFooBar y = new FooBar();   // implements IFooBar
    IFooBar x = new FooBarProxy(y);   // also implements IFooBar, but with the callback and delegate
    x.foo();  // calls y.foo() implicitly
    ...