java - 获取实现给定接口(interface)的所有类

标签 java android maven reflection maven-plugin

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

重点是我需要一个实现给定接口(interface)的所有类的数组,这样我就可以将它们分配给字节数。该数字是类的唯一标识符,我使用它从字节数组中获取对象,并通过蓝牙从另一个设备发送。

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

经过一些研究,我提出了一些想法:

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

任何帮助将不胜感激,

格雷格

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

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

最佳答案

我目前不确定我是否完全理解你的问题,但如果你只想要一个包含实现 Datagram 接口(interface)的类的数组,我会建议如下:

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

}

关于java - 获取实现给定接口(interface)的所有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066079/

相关文章:

java - 在多个列中选择多个值

java - 如何使用 Maven 创建独立的应用程序且依赖关系完好无损?

java - 无法在 Java 中返回字符串

java - 如何在android中读取USSD消息响应

Android TextView 动画无限重复不起作用

android - 拖放 RecyclerView 的第一项会移动几个随机位置

java - 无法在 Kafka Producer 中实例化 GenericRecord 以将 avro 流式传输到主题

maven - 尝试在 JENKINS 中运行作业时,Maven 中的 "Peer Not Authenticated"

java - 如何从另一台机器查看 GWT Jetty devmode?

maven - 无法解析类或包 H2