V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kerb15
V2EX  ›  Android

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

  •  
  •   kerb15 · 2020-10-20 19:52:36 +08:00 · 11072 次点击
    这是一个创建于 1527 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    codehz
        1
    codehz  
       2020-10-20 20:32:12 +08:00
    因为 clazz 是运行期传入的。。。
    TJT
        2
    TJT  
       2020-10-20 20:57:30 +08:00
    因为不能...
    billlee
        3
    billlee  
       2020-10-20 21:21:57 +08:00
    Application 是个接口或抽象类吧
    maninfog
        4
    maninfog  
       2020-10-20 21:40:04 +08:00 via Android
    试想在我们继承 Application 的情况?这样系统只能从 manifest 中拿到我们继承的类名,然后构建 Class 对象,再去实例化
    zpxshl
        5
    zpxshl  
       2020-10-20 22:30:38 +08:00 via Android
    只能反射,理由如 4 楼。
    activity 的创建过程也是同理
    lijialong1313
        6
    lijialong1313  
       2020-10-20 23:24:06 +08:00
    这其实就是 app 运行时候才知道这个是啥东西,相当于父类要先知道子信息了才能生成父类,明显只能用反射。
    fangcan
        7
    fangcan  
       2020-10-21 09:47:37 +08:00
    编码阶段无法确定的,在运行期才能确定的,只能用反射的方式实现
    hoyixi
        8
    hoyixi  
       2020-10-21 12:46:22 +08:00
    Java 日常,有配置文件的地方就有反射,因为按照配置约束,你知道用户配了个“寂寞”,但是你不知道用户写的具体是“单身狗剧荒”, 还是“单身狗 X 饥渴”
    kerb15
        9
    kerb15  
    OP
       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
        10
    kerb15  
    OP
       2020-10-21 15:49:04 +08:00
    哦哦哦,我知道了,我犯糊涂了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1165 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:25 · PVG 02:25 · LAX 10:25 · JFK 13:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.