跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Android 面试题咨询 “编译中生成的类,怎么让外部调用(不能先编译)”
未分類
18 1 月 2021

Android 面试题咨询 “编译中生成的类,怎么让外部调用(不能先编译)”

Android 面试题咨询 “编译中生成的类,怎么让外部调用(不能先编译)”

資深大佬 : zpxshl 6

如题。 某大厂的面试题, 求大佬指点下思路或者给个关键字。

大佬有話說 (19)

  • 資深大佬 : skyinu

    写一个中间类提供给外部调用?中间类自己反射调用生成类?

  • 資深大佬 : woodnaonly

    依赖 jar 不编译

  • 資深大佬 : xcstream

    private class

  • 資深大佬 : john6lq

    原谅我题目都看不太懂

  • 資深大佬 : loshine1992

    这个问的是 ButterKnife 等使用 APT 的库的原理

  • 主 資深大佬 : zpxshl

    @loshine1992 大佬,能稍微展开讲讲吗? 我看了 ButterKnife 的原理,生成 r2 和代码,r2 只是为了让编译通过(注解不能使用变量,因此不能用 R )。 生成的代码里面还是使用了 R.id.xxxx 。 可这和题目有啥关系…

  • 資深大佬 : nnqijiu

    编译中生成的类是啥意思?

  • 主 資深大佬 : zpxshl

    @nnqijiu 有些类是编译阶段才生成的。 比如 R.java

  • 資深大佬 : liuzhedash

    问就是反射

  • 資深大佬 : fox0001

    编译生成的类,继承已生成的父类或者接口,可以不?除了把数据编译进方法中,没想到有什么好处…

  • 資深大佬 : twoyuan

    应该是 #1 、#5 说的类似 ButterKnife 实现的这种方式,根据注解生成了类,实际对生成的类调用时使用反射。

    很久不用这个库了,可以顺着 ButterKnife.bind 入口往里翻就能找到答案(如果它没改实现方案的话)

  • 資深大佬 : Guaidaodl

    通常来说这种问题有两个方向. 一个是注解(Annotation), 另外一个是 Ttransform.

    1. 注解的处理流程是在编译之前的. 所以其实你就直接引用你要生成的类就好. 因为注解在编译前处理, 所以编译是可以正常通过的. 如果不想在 build 之前 Android Studio 显示错误的话, 通常偷取一个接口和一个工厂类 /方法, 里面会用放射的方式来创建实现类.

    2. Transform 流程可以直接修改字节码, 是在编译成 class 文件后进行的. 这里通常就是反射加工厂了.

    还有一种可能是 SPI. 不过 SPI 的实现通常都是手写的实现的. 很少是编译期间生成的.

  • 主 資深大佬 : zpxshl

    @twoyuan 感谢,明早我看下 bufferknife 的源码,之前对它的分析停留在几篇文章上……

  • 資深大佬 : lxilu

    什么叫不能先编译?

  • 資深大佬 : kingfalse

    运行时动态编译?

  • 資深大佬 : Cabana

    1,接口
    2,反射

  • 資深大佬 : wjploop

    编译前和编译后处理的对象分别是*.java 和*.class,这里要求编译前,可以使用解析 java 文件的库[javaparser]( https://javaparser.org/),类似 Jsoup 于*.xml

  • 資深大佬 : unco020511

    对不起,我连题目都没看明白

  • 資深大佬 : Anarchy

    编译中生成的只是 ide 不提示你知道也可以写代码正常走编译流程。如果是动态加载的就搞个中间类反射调用。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具