【问题标题】:Ways to inject functionality (similar to dynamic proxy but less intrusive)注入功能的方式(类似于动态代理,但侵入性较小)
【发布时间】:2016-10-13 09:47:21
【问题描述】:

在不打扰开发人员的情况下,我必须通过使用动态代理向方法(带注释的)添加功能吗?

经典例子:

public int sum(int x, int y){
   StaticInstance.doThisBefore(x,y); // ccc
   int result = x+y;  // business functionality
   StaticInstance.doThisAfter(result); // ccc
   return result;
}

那么动态代理可以做什么。动态代理的问题在于,它具有侵入性。

  • 注解处理器让您只创建新类而不修改现有类(我说的对吗?)
  • 修改字节码?
  • 编解码器?
  • 无法使用代理。

开发人员可能正在使用 Spring 框架、Java EE 或任何他喜欢的框架,因此不影响开发人员代码的样式和方式非常重要。

因此,该选项应该是非侵入性的,这一点非常重要。

【问题讨论】:

  • 您要修改源代码还是字节码?
  • 看看AspectJ?
  • @ArcticLord 两种方式都是可能的——哪种方式最有效?有什么想法吗?
  • @DavidL 我已经检查过 AspectJ,但它更具侵入性,不是吗?

标签: java proxy code-injection


【解决方案1】:

您可以为程序员提供一个抽象类,其中包含一个调用要从子类实现的实际业务方法的方法。 调用完整功能的方法应由接口支持:

public interface Service {
    int getResult(int x, int y);
}

而抽象类实现了接口,但将实际的业务逻辑方法留给子类实现:

public abstract class AbstractClass implements Service {
    public int getResult(int x, int y) {
        StaticInstance.doThisBefore(x,y); // ccc
        int result = process(x, y);
        StaticInstance.doThisAfter(result); // ccc
    }

    // this is the actual business logic to be implemented by subclasses
    public abstract int process(int x, int y);
}

子类将实现实际的业务逻辑,例如:

public class MyClass extends AbstractClass {
    public int process(int x, int y) {
        return x+y;
    }
}

因此,开发人员只需要记住子类AbstractClass,但他的代码只处理实际的业务逻辑。

最后,您的代码中对该服务的调用将是:

Service myService = new MyClass();
System.out.println(myService.getResult(5, 6));

【讨论】:

  • @Reymanx 这个答案对你有好处吗?你愿意接受吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2020-04-21
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多