java - 注入(inject)功能的方式(类似于动态代理但侵入性较小)

标签 java proxy code-injection

在不使用动态代理打扰开发人员的情况下,我有哪些可能性可以向方法(带注释)添加功能?

经典例子:

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 或他喜欢的任何框架,因此开发人员编码的风格和方式不受影响非常重要。

因此,该选项应该不具有干扰性,这一点非常重要。

最佳答案

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

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

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

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));

关于java - 注入(inject)功能的方式(类似于动态代理但侵入性较小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017626/

相关文章:

java - 是否可以使用 Spring 在两个不同的数据库(MongoDB 和 MySQL)中进行包含插入的事务?

java - 有一个只有 main 的类。我应该创建一个对象并调用 obj.Main() 还是 ClassObj.Main()?

java - 如何在java中构造scala.collection.immutable.List对象

google-app-engine - Google App Engine 高性能代理解决方法

security - 尝试设置安全 NIFI 集群时获取不受信任的代理消息

c# - .NET/C# 检查 SQL 查询是否修改数据库,如果不执行

c# - 如何使用 SetWindowHookEx 从 C# 应用程序注入(inject) native dll(比使用 CreateRemoteThread 注入(inject)更安全)

java - HtmlUnit 点击后没有获取内容

go - 如何在Go中手动代理应用程序/八位字节流(实时视频)?

php - 为什么 mysql_real_escape_string() 没有阻止 hack?