我有接口Datagram
和几个实现它的类,例如A
和B
。
在运行时的某个时刻,我通过蓝牙对象接收实现给定接口(A
或B
)。我通过添加特殊的类标识号作为发送消息的第一个字节来区分它们。
关键是我需要一个实现给定接口的所有类的数组,所以我可以将它们分配给字节数。这个数字在类的唯一标识符中,我用它从字节数组中获取对象,通过蓝牙从另一个设备发送。
现在通过创建像private static final Class[] datagramClasses = { A.class, B.class };
这样的数组来“手动”完成,但这是非常无关紧要的方式 - 如果我将类C
添加到我的程序中,我需要将它追加到datagramClasses
数组太。或者,我可以在每个Datagram
中发送完整的班级名称,但这很愚蠢。
在做了一些研究之后,我想出了一些想法:
.class
个文件中获取信息(类名)并使用Class.forName("com.mypackage.A");
。但Android使用单个.dex
文件而不是.class
个文件。非常感谢任何帮助,
格雷格
编辑:我希望能够执行如下代码:
final List<Class> list = new ArrayList<>();
for (final Class c : allAplicationClasses)
if (isAssignableFrom(Datagram.class))
list.add(c);
答案 0 :(得分:0)
我目前还不确定我是否完全理解你的问题,但如果你只是想要一个包含实现数据报接口的类的数组,我会建议像这样:
public class MainActivity extends Activity {
private List<iDatagram> list = new ArrayList<iDatagram>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list.add(new A());
list.add(new B());
list.add(new C());
int i = 0;
for (iDatagram item : list) {
Log.i("class name", item.getName());
if (item instanceof A) {
Log.i("item at location "+i, item.getName());
}
else if (item instanceof B) {
Log.i("item at location "+i, item.getName());
}
else if (item instanceof C) {
Log.i("item at location "+i, item.getName());
}
i++;
}
}
interface iDatagram {
String getName();
}
class A implements iDatagram {
private String name = "I am class A";
@Override
public String getName() {
return name;
}
}
class B implements iDatagram {
private String name = "I am class B";
@Override
public String getName() {
return name;
}
}
class C implements iDatagram {
private String name = "I am class C";
@Override
public String getName() {
return name;
}
}
}