java - 我可以在 Java 中调用运行时决定的方法调用吗?

标签 java reflection service soa

我知道有一个调用函数可以完成这些工作,我对使用这种行为的“正确性”总体上很感兴趣。 我的问题是: 我有一个服务对象女巫,其中包含我认为是服务的方法。 我想要做的是改变这些服务的行为,而不是以后的入侵。 例如:

class MyService {

      public ServiceResponse ServeMeDonuts() {
      do stuff...
      return new ServiceResponse();

}

2 个月后,我发现我需要为新的客户端应用程序提供相同的服务,而且我还需要做一些额外的事情,比如设置标志,或者制作或更新某些数据,或者对响应进行不同的编码。我能做的就是弹出它并放下一些 IF。在我看来,这并不好,因为这意味着与经过测试的代码进行交互,并且可能会导致以前的服务客户出现不需要的行为。

所以我来向我的注册表添加一些内容,告诉系统“NewClient”具有不同的行为。所以我会做这样的事情:

public interface Behavior {
    public void preExecute();
    public void postExecute();
}

public class BehaviorOfMyService implements Behavior{
      String method;
      String clientType;

      public void BehaviorOfMyService(String method,String clientType) {
              this.method = method;
              this.clientType = clientType;
      }

      public void preExecute() {

        Method preCall = this.getClass().getMethod("pre" + this.method + this.clientType);
        if(preCall != null) {
            return preCall.invoke();
        } 
           return false;
      }

      ...same for postExecute();
     public void preServeMeDonutsNewClient() {
           do the stuff...
     }
}

系统什么时候会做这样的事情

if(registrySaysThereIs different behavior set for this ServiceObject) {
      Class toBeCalled = Class.forName("BehaviorOf" + usedServiceObjectName);
      Object instance = toBeCalled.getConstructor().newInstance(method,client);
      instance.preExecute();
      ....call the service...
      instance.postExecute();
      ....
}

我对代码的正确性以及思维和方法的正确性并不特别感兴趣。实际上我必须用 PHP 来做这件事,我认为这是一种编程的流行音乐,出于商业原因我必须“唱歌”,即使我玩 POP 我真的很想按规定唱歌,所以把我的更多放在一边或不太受启发的类比 我真的很想知道您对此事的看法,因为它具有实际必要性和技术方法。

谢谢

最佳答案

申请的好案例Aspect Oriented Programming .使用 AOP,您可以将 方面 附加到事件或方法,以便在事件之前或之后处理额外的逻辑。

AOP有很好的例子here以及 Java 的示例 here

此示例使用 aspectwerkz与您的情况非常相似,基本上是在服务执行周围添加后处理程序和前处理程序。

我不太熟悉 PHP 中的 AOP,但有一些项目可以使用,例如 this one.

关于java - 我可以在 Java 中调用运行时决定的方法调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4689649/

相关文章:

java - java实现循环链​​表

Java - 通过添加新类而不修改任何其他内容来添加功能

java - Websphere Liberty - 如何从 Windows 注册表获取 keystore 密码?

java - Android HttpUrlConnection 不支持摘要身份验证?

java - 如何在android中使用对象模型数据库获取日期和月份列

android - Android 上 pubnub 的最佳实践

java - 服务不接收多媒体按钮单击事件

Java:使用反射正确检查类实例化

c# - 如何拦截 C# 中的方法调用?

android - Android 8以上版本Delphi无法启动Android Service