本文介紹了Android:使用Guava加載跨庫接口實(shí)現(xiàn)的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我希望在我的Android應(yīng)用程序中收集具體接口的所有實(shí)現(xiàn)。我有這樣的東西:
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());
總是為零。當(dāng)我在單元測試中從我的庫本地運(yùn)行它時,它是正常的。可能,這是ClassLoader
的問題。它不提供有關(guān)應(yīng)用程序提供的所有包的信息。
我不想使用DexFile
,因?yàn)樗莇eprecated 。沒有有關(guān)entries()
替換函數(shù)的其他信息。
是否有可能解決此問題?
推薦答案
TLDR:
您可以使用dagger依賴項(xiàng)(或更新,hilt)將組件安裝到一個域中,例如SingletonComponent
,并通過實(shí)現(xiàn)將其作為構(gòu)造函數(shù)參數(shù)注入。您甚至可以按設(shè)置注入多個實(shí)現(xiàn)。
真實(shí)答案:
我已經(jīng)創(chuàng)建庫common
和test
。這些庫固定在我的應(yīng)用程序中。
-
在
common
模塊中,您可以創(chuàng)建任何界面,如:
public interface Item {
}
-
將依賴項(xiàng)
common
設(shè)置為test
。重新加載依賴項(xiàng)。現(xiàn)在您可以在test
庫中看到Item
。編寫實(shí)現(xiàn)接口的自定義類:
public class CustomItem implements Item{
//...
}
-
在
test
庫中創(chuàng)建模塊:
@Module
@InstallIn(SingletonComponent.class)
public class TestModule {
@Provides
@Singleton
@IntoSet
public Item customItem() {
return new CustomItem();
}
}
-
在應(yīng)用程序中設(shè)置依賴項(xiàng)
common
和test
,并使用您的實(shí)現(xiàn)集添加模塊:
@Module
@InstallIn(SingletonComponent.class)
public class ApplicationSingletonModule {
@Provides
@Singleton
public CustomClassProvider customClassProvider(Set<Item> items) {
return new CustomClassProvider(items);
}
}
您可以添加多個Item
實(shí)現(xiàn)并將其跨庫插入,沒有任何問題。
這篇關(guān)于Android:使用Guava加載跨庫接口實(shí)現(xiàn)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,