比如 Instrument.java 类中的 Application app = (Application)clazz.newInstance();
为什么不直接写成 Application app = new Application();
最近阅读安卓源码发现有很多类似的写法,基本上能不 new 就不 new,这是出于什么考量呢?
网上有人说反射是为了降低耦合,但是单纯看这个场景这行代码的话,没有看出降低耦合的地方,还是说这是反射思想用多了的一种写法习惯呢?
比如 Instrument.java 类中的 Application app = (Application)clazz.newInstance();
为什么不直接写成 Application app = new Application();
最近阅读安卓源码发现有很多类似的写法,基本上能不 new 就不 new,这是出于什么考量呢?
网上有人说反射是为了降低耦合,但是单纯看这个场景这行代码的话,没有看出降低耦合的地方,还是说这是反射思想用多了的一种写法习惯呢?
|
codehzOct 20, 2020
1
因为 clazz 是运行期传入的。。。
|
|
TJTOct 20, 2020
2
因为不能...
|
|
billleeOct 20, 2020
3
Application 是个接口或抽象类吧
|
|
maninfogOct 20, 2020 via Android
4
试想在我们继承 Application 的情况?这样系统只能从 manifest 中拿到我们继承的类名,然后构建 Class 对象,再去实例化
|
|
zpxshlOct 20, 2020 via Android
5
只能反射,理由如 4 楼。
activity 的创建过程也是同理 |
|
lijialong1313Oct 20, 2020
6
这其实就是 app 运行时候才知道这个是啥东西,相当于父类要先知道子信息了才能生成父类,明显只能用反射。
|
|
fangcanOct 21, 2020
7
编码阶段无法确定的,在运行期才能确定的,只能用反射的方式实现
|
|
hoyixiOct 21, 2020
8
Java 日常,有配置文件的地方就有反射,因为按照配置约束,你知道用户配了个“寂寞”,但是你不知道用户写的具体是“单身狗剧荒”, 还是“单身狗 X 饥渴”
|
|
9
```
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 |
|
10
哦哦哦,我知道了,我犯糊涂了
|