因此,我正在编写一个Web服务体系结构,其中包括执行请求的实际处理的FunctionProvider类,以及一个主要的Endpoint类,该类接收请求并将请求委托给适当的FunctionProvider

我不完全知道运行时可用的FunctionProvider,因此我需要能够在我的主Endpoint类中“注册”(如果这是正确的词),并查询它们是否匹配传入请求。

public class MyFunc implements FunctionProvider{
  static {
    MyEndpoint.register(MyFunc);
  }
  public Boolean matchesRequest(Request req){...}
  public void processRequest(Request req){...}
}

public class MyEndpoint{
  private static ArrayList<FunctionProvider> functions = new ArrayList<FunctionProvider>();
  public void register(Class clz){
    functions.add(clz);
  }
  public void doPost(Request request){
    //find the FunctionProvider in functions
    //matching the request
  }
}


我确实没有像这样做过很多反射性的Java(上面的代码可能是错误的,但希望能证明我的意图)。

什么是最好的方式来实现这一目标而又不会被黑客入侵?

最佳答案

不要让FunctionProviders自注册。通过某个应用程序init引导端点。使用FunctionProviders列表进行调用。这样,您可以配置优先级(如果两个提供商都声称他们可以处理请求,该怎么办?)。现在设置方式,您需要以某种方式调用该类以触发静态构造函数,而这又是间接的。
如果检测FunctionProvider是否支持给定请求很简单,请考虑使其成为配置的一部分。如果在请求中,则将其映射到该FunctionProvider。这将使关注点分离开一些。如果检测很复杂,请考虑从FunctionProvider的单独类中进行检测。
通过配置委托/函数指针,可以完全避免使用FunctionProvider(不确定Java是否/如何支持委托)。

10-04 18:20