对象工厂的依赖注入

时间:2015-08-28 08:13:39

标签: java dependency-injection dagger-2

如果我们有几个类看起来像:

@Device()
@Model("some model")
@Variant("A")
public class SomeModelVariantA extends BaseDevice {

    public SomeModelVariantA (InputStream in, OutputStream out, int encoding) throws IOException {
        super(in, out, encoding);
    }

    @Override
    @CommandSpec("41")
    @WithoutArguments
    @WithoutResponse
    public Response init(Command args) throws NotSupportedException, IOException {
        return null;
    }

我使用JavaPoet和注释处理生成类实现。 我有我使用的所有注释的项目,具有Annotation处理器的项目编译器来处理带注释的类和带有注释,生成的类和其他逻辑的Application项目。所有生成的类都扩展了基类BaseDevice类,如下所示:

/**
 * Generated on Fri Aug 28 11:03:21 EEST 2015
 */
public final class SomeModelVariantA extends BaseDevice {
  public SomeModelVariantA (InputStream arg0, OutputStream arg1, int arg2) throws IOException {
    super(arg0, arg1, arg2);
  }

  @Override
  public Response init(Command arg0) throws NotSupportedException, IOException {
    StringBuilder builder = new StringBuilder("");
    Response response = new Response();

    customCommand(41, builder.toString());
    return response;
  }

我已经生成了几个具体设备,下一步是创建一个使用这些设备的API。

public class Api {

    BaseDevice device;

    Api(String device, InputStream is, OutputStream os, int encoding) {
        if ("SomeModelVariandA1".contentEquals(device)) {
            device = new SomeModelVariantA(is, os, encoding);
        }
        ... else if for other devices
    }

    public void callInit() {
        device.init(null);
    }
}

那么如何为所有设备生成工厂并通过一些String名称将设备注入Api类。如何处理提供使用api构造函数的输入和输出流创建的设备。匕首2和谷歌汽车工厂是否适用于此目的,并且有人可以提供示例用法。

由于

1 个答案:

答案 0 :(得分:0)

您需要设置为concreteClass完整的班级名称(包+班级名称),然后使用Class.forName(concreteClass)

例如,如果您在ClassA包中定义com.blablabla.classes,则需要设置为concreteClass"com.blablabla.classes.ClassA"。 然后,如果您只想创建扩展BaseClass的类对象,则需要像这样定义新类:

Class<T extends BaseClass> injectedClass = Class.forName(concreteClass); 或者,如果要创建所有类对象,则需要定义:

Class injectedClass = Class.forName(concreteClass);