2017-04-17 31 views
3

我正在开发一个需要访问实现它的应用程序的布局项目的库。我知道如何去做的唯一方法就是反思。换句话说,如果我创建一个构造到音乐库API是这样的:从我的Android库访问应用程序R类

public MyLibraryAPI(String packageName) { 
    Class appR = Class.forName(String.format("%s.R", packageName)); 
    ... 
} 

而且,开发者将与他的包名称作为构造函数参数实例库。

我最终需要的是让我的内部类知道开发人员布局(.xml文件)中使用的Android视图 - id和类型。有没有办法实现这一点,没有反思和逃避性能开销?我敢肯定,这是无法完成的,但如果有专家看到我没有注意到的情况,我会问。

编辑:此外,默认情况下,proguard混淆了保护代码,但因此无法为运行时实现反射的手段提供JVM,所以如果我使用反射,我不得不要求开发人员转为他或她的R课关闭proguard混淆,这是一个无赖。

+1

你可以使用注释处理器吗?类似于Butterknife的工作方式? –

+0

是的,我可以使用注释处理将执行移动到编译时。但是,从开发人员的角度来看,这需要更大的努力,因为他必须为绑定提供注释。或者我错了?我仍然只是辩论,我并不倾向于任何一方。无论如何感谢您的回复。 – NitroNbg

回答

1

对Android的反思极其昂贵。一些好的和流行的图书馆,如Roboguice已经倒下,部分原因是反射的性能成本。

我怀疑某种代码生成是正确的解决方案。 Dagger 2Butter KnifeData Binding Library是使用代码生成的Android库的成功例子。由于数据绑定库对XML执行检查,因此它必须可用于编译阶段的代码生成库,并且可以基于此实现:以下链接指向source jars at Maven Central

除此之外,是的,似乎会有易用性和难以实施之间的一些妥协。如果你强迫你的消费者使用你的注释来注释他们的类,它就变得更难使用,但可能更容易实现。如果您限制自己检查XML和生成的文件并从中生成代码,那么我认为您的工作会变得更加困难。另一方面,使用注释变得相当普遍,它可能不会成为用户的一个问题。

祝你好运!

相关问题