获取实现给定接口的所有类

时间:2014-02-27 10:43:35

标签: java android maven reflection maven-plugin

我有接口Datagram和几个实现它的类,例如AB。 在运行时的某个时刻,我通过蓝牙对象接收实现给定接口(AB)。我通过添加特殊的类标识号作为发送消息的第一个字节来区分它们。

关键是我需要一个实现给定接口的所有类的数组,所以我可以将它们分配给字节数。这个数字在类的唯一标识符中,我用它从字节数组中获取对象,通过蓝牙从另一个设备发送。

现在通过创建像private static final Class[] datagramClasses = { A.class, B.class };这样的数组来“手动”完成,但这是非常无关紧要的方式 - 如果我将类C添加到我的程序中,我需要将它追加到datagramClasses数组太。或者,我可以在每个Datagram中发送完整的班级名称,但这很愚蠢。

在做了一些研究之后,我想出了一些想法:

  1. .class个文件中获取信息(类名)并使用Class.forName("com.mypackage.A");。但Android使用单个.dex文件而不是.class个文件。
  2. 使用外部库来做到这一点 - 我尝试了Reflections和其他几个,但我无法在Android平台上编译它们。是否有更简单的库可以解决这个问题?
  3. 创建Maven插件,就可以了。我成功地将Maven添加到我的Android项目中,但是我无法编译一些额外的插件来开发相关的库(再次,由于Android限制)。我可以用Java创建另一个相关的项目,并在那里开发插件,但我担心它会太复杂。
  4. 非常感谢任何帮助,

    格雷格

    编辑:我希望能够执行如下代码:

    final List<Class> list = new ArrayList<>();
    for (final Class c : allAplicationClasses)
        if (isAssignableFrom(Datagram.class))
            list.add(c);
    

1 个答案:

答案 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;
    }
}

}