简单的解决方案
您可以保存映射类< T> – >处理程序< T>在地图中.就像是:
Map, Handler> registry = new HashMap<>();
public void registerHandler(Class dataType, Class extends Handler> handlerType) {
registry.put(dataType, handlerType);
}
public Handler getHandler(Class clazz) {
return registry.get(clazz).newInstance();
}
在某些地方,初始化处理程序(可能在工厂本身):
factory.registerHandler(String.class, StringHandler.class);
factory.registerHandler(Date.class, DateHandler.class);
在另一个地方,您创建并使用它们:
Handler stringhandler = factory.getHandler(String.class);
Handler dateHandler = factory.getHandler(Date.class);
更复杂的解决方案
您可以使用反射“扫描”类,而不是手动注册映射类< T> – >处理程序< T>,使用反射做.
for (Class extends Handler> handlerType : getHandlerClasses()) {
Type[] implementedInterfaces = handlerType.getGenericInterfaces();
ParameterizedType eventHandlerInterface = (ParameterizedType) implementedInterfaces[0];
Type[] types = eventHandlerInterface.getActualTypeArguments();
Class dataType = (Class) types[0]; //
factory.registerHandler(dataType, handlerType);
}
然后,您可以像上面一样创建和使用它们:
Handler stringhandler = factory.getHandler(String.class);
Handler dateHandler = factory.getHandler(Date.class);
要实现getHandlerClasses(),请查看this以扫描jar中的所有类.对于每个类,您必须检查它是否是处理程序:
if (Handler.class.isAssignableFrom(scanningClazz) //implements Handler
&& scanningClazz.getName() != Handler.class.getName()) //it is not Handler.class itself
{
//is a handler!
}
希望能帮助到你!