簡體   English   中英

獲取實現給定接口的所有類

[英]Get all classes implementing given interface

我有Datagram接口和一些實現它的類,例如AB 在運行時的某個時刻,我通過實現給定接口(即AB )的Bluetooth對象接收。 我通過添加特殊的類標識號作為發送消息的第一個字節來區分它們。

關鍵是我需要實現給定接口的所有類的數組 ,因此可以將它們分配給字節數。 類的唯一標識符中的那個數字,我用它從字節數組中獲取對象,並通過藍牙從另一台設備發送。

現在,通過創建像private static final Class[] datagramClasses = { A.class, B.class };這樣的數組來“手動”完成此操作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創建另一個相關項目,並在那里開發插件,但是我擔心它太復雜了。

任何幫助將非常感激,

格雷格

編輯:我希望能夠執行如下代碼:

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

我目前不確定我是否能完全理解您的問題,但是如果您只想要一個包含實現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;
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM