我当前的项目中有多个类,例如HTMLRequest
,SPDYRequest
,BHIVERequest
。我从网络流中获取数据,我想找出哪些类可以处理此数据。为此,我读取了Stream数据包的标头(所有协议的格式都相同,因此我可以读取直到获得空行(\ r \ n)),然后将此标头传递给请求类中的静态函数,该函数返回一个布尔值,指示它是否是此类请求的标头。现在,我希望能够在运行时(从插件)加载特定的协议。什么是能够检查我是否有头文件协议的最佳方法。
我的想法是:
一个额外的类Protocol
作为单例,然后在RequestFactory
中注册,然后必须找出哪个Protocol可以为这种标头创建请求并调用Protocol.assemble()Class<? extends Request>
的静态列表,因此我可以通过反射或Class.newInstance()
调用静态方法
我不喜欢这两个想法,那么在Java中动态地做这些事情的正确方法是什么?
最佳答案
如果是我,我会做与选项1类似但不同的事情:
在启动时阅读所有插件,并在HashMap
或类似名称的实用程序的RequestFactory
中存储它们的标头和对它们的类名或实例(如果它们是无状态的)的引用。您还将在此映射中存储对内置系统协议的引用。
收到请求时,请调用RequestFactory.getProtocol(String header)
以获取对应使用的协议的引用。
注意,如果走这条路线,在每个协议类中都不需要一个方法来查询标头是否适合它;工厂为您处理。
编辑
...我只是注意到您问题的“运行时”部分,这使得我的解决方案中的“启动时”部分有点不合适。新插件在被识别/加载后仍可以注册到工厂的内部地图中;不应影响整个设计的实用性。
关于java - 如何搜索可以处理Java中特定数据的类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19730597/