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

Posted

技术标签:

【中文标题】获取所有实现给定接口的类【英文标题】:Get all classes implementing given interface 【发布时间】:2014-02-27 10:43:34 【问题描述】:

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

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

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

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

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

任何帮助将不胜感激,

格雷格

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

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

【问题讨论】:

如何在Datagram 中创建一个静态工厂方法,根据内容创建AB 等实例? 为什么需要那个数组? @pskink 我已经编辑了我的问题,希望现在更清楚了。 【参考方案1】:

我目前不确定我是否完全理解了您的问题,但如果您只想要一个包含实现 Datagram 接口的类的数组,我建议您这样做:

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;
    

【讨论】:

不,这不是我所期望的。我希望所有类没有定义new A()A.class @gogowitczak 为什么?为什么你需要 rhat 数组?

以上是关于获取所有实现给定接口的类的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序中获取所有实现接口的对象

如何找到实现给定接口的所有类?

怎么通过反射获取所有继承了某一接口的类

java如何通过反射获取包中所有的类?

获取数据库连接

获取继承特定接口的类列表? [复制]