我正在开发一个需要访问实现它的应用程序的布局项的库。我知道怎么做的唯一方法就是反思。换句话说,如果我为我的库API创建一个构造函数,如下所示:
public MyLibraryAPI(String packageName) {
Class appR = Class.forName(String.format("%s.R", packageName));
...
}
开发人员将使用包名作为构造函数中的参数来实例化库。
我最终需要的是让我的内部类知道开发人员布局(.xml文件)中使用的Android视图 - 包括id和类型。有没有办法在没有反射的情况下实现这一目标并避免性能开销?我确定无法做到,但要求以防专家看到我没注意到的事情。
编辑:此外,默认情况下,proguard会对代码进行模糊处理,但结果却无法为JVM提供在运行时实现反射的方法,所以如果我使用反射,我必须要求开发人员关闭对他或她的R级进行的混淆,这是一个无赖。
答案 0 :(得分:1)
对Android的反思非常昂贵。一些善意和受欢迎的图书馆如Roboguice已经倒闭,部分原因是反思的表现成本。
我怀疑某种代码生成是正确的解决方案。 Dagger 2,Butter Knife和Data Binding Library是使用代码生成的Android库的成功示例。由于数据绑定库会对XML执行检查,因此它必须可用于构建中该阶段的代码生成库,您可以将实现基于以下内容:此处是指向source jars at Maven Central的链接
除此之外,似乎在易用性和难以实施之间会有一些妥协。如果强制消费者使用注释对其类进行注释,则使用起来会变得更加困难,但实现起来可能要容易得多。如果您限制自己检查XML和生成的R
文件并从中生成代码,那么我认为您的工作将变得更加困难。另一方面,使用注释已变得相当普遍,对用户而言可能不是这样的问题。