本文介紹了Android:使用Guava加載跨庫接口實現的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我希望在我的Android應用程序中收集具體接口的所有實現。我有這樣的東西:
List<T> list = ClassPath.from(ClassLoader.getSystemClassLoader())
.getTopLevelClasses(Reflection.getPackageName(parent))
.stream()
.map(ClassPath.ClassInfo::load)
.filter(current -> isImplementation(parent, current))
.map(aClass -> (T) aClass)
.collect(Collectors.toList());
但它總是返回0個類。即使我想檢索所有類:
ClassPath.from(ClassLoader.getSystemClassLoader())
.getAllClasses()
.stream()
.map(ClassPath.ClassInfo::load)
.collect(Collectors.toList());
總是為零。當我在單元測試中從我的庫本地運行它時,它是正常的。可能,這是ClassLoader
的問題。它不提供有關應用程序提供的所有包的信息。
我不想使用DexFile
,因為它是deprecated 。沒有有關entries()
替換函數的其他信息。
是否有可能解決此問題?
推薦答案
TLDR:
您可以使用dagger依賴項(或更新,hilt)將組件安裝到一個域中,例如SingletonComponent
,并通過實現將其作為構造函數參數注入。您甚至可以按設置注入多個實現。
真實答案:
我已經創建庫common
和test
。這些庫固定在我的應用程序中。
-
在
common
模塊中,您可以創建任何界面,如:
public interface Item {
}
-
將依賴項
common
設置為test
。重新加載依賴項。現在您可以在test
庫中看到Item
。編寫實現接口的自定義類:
public class CustomItem implements Item{
//...
}
-
在
test
庫中創建模塊:
@Module
@InstallIn(SingletonComponent.class)
public class TestModule {
@Provides
@Singleton
@IntoSet
public Item customItem() {
return new CustomItem();
}
}
-
在應用程序中設置依賴項
common
和test
,并使用您的實現集添加模塊:
@Module
@InstallIn(SingletonComponent.class)
public class ApplicationSingletonModule {
@Provides
@Singleton
public CustomClassProvider customClassProvider(Set<Item> items) {
return new CustomClassProvider(items);
}
}
您可以添加多個Item
實現并將其跨庫插入,沒有任何問題。
這篇關于Android:使用Guava加載跨庫接口實現的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,