为什么安卓源码经常用反射不用 new?

2020-10-20 19:52:36 +08:00
 kerb15

比如 Instrument.java 类中的 Application app = (Application)clazz.newInstance();

为什么不直接写成 Application app = new Application();

最近阅读安卓源码发现有很多类似的写法,基本上能不 new 就不 new,这是出于什么考量呢?

网上有人说反射是为了降低耦合,但是单纯看这个场景这行代码的话,没有看出降低耦合的地方,还是说这是反射思想用多了的一种写法习惯呢?

11143 次点击
所在节点    Android
10 条回复
codehz
2020-10-20 20:32:12 +08:00
因为 clazz 是运行期传入的。。。
TJT
2020-10-20 20:57:30 +08:00
因为不能...
billlee
2020-10-20 21:21:57 +08:00
Application 是个接口或抽象类吧
maninfog
2020-10-20 21:40:04 +08:00
试想在我们继承 Application 的情况?这样系统只能从 manifest 中拿到我们继承的类名,然后构建 Class 对象,再去实例化
zpxshl
2020-10-20 22:30:38 +08:00
只能反射,理由如 4 楼。
activity 的创建过程也是同理
lijialong1313
2020-10-20 23:24:06 +08:00
这其实就是 app 运行时候才知道这个是啥东西,相当于父类要先知道子信息了才能生成父类,明显只能用反射。
fangcan
2020-10-21 09:47:37 +08:00
编码阶段无法确定的,在运行期才能确定的,只能用反射的方式实现
hoyixi
2020-10-21 12:46:22 +08:00
Java 日常,有配置文件的地方就有反射,因为按照配置约束,你知道用户配了个“寂寞”,但是你不知道用户写的具体是“单身狗剧荒”, 还是“单身狗 X 饥渴”
kerb15
2020-10-21 15:45:18 +08:00
```
static public Application newApplication(Class<?> clazz, Context context)
throws InstantiationException, IllegalAccessException,
ClassNotFoundException {
Application app = (Application)clazz.newInstance();
app.attach(context);
return app;
}
```
这个方法好像没有用到我们自己写的 Application,就是默认的 Application
@maninfog
@zpxshl
kerb15
2020-10-21 15:49:04 +08:00
哦哦哦,我知道了,我犯糊涂了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX