如果我们有几个类看起来像:
@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和谷歌汽车工厂是否适用于此目的,并且有人可以提供示例用法。
由于
答案 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);