
如题。 某大厂的面试题, 求大佬指点下思路或者给个关键字。
1 skyinu 2021-01-17 15:54:56 +08:00 via iPhone 写一个中间类提供给外部调用?中间类自己反射调用生成类? |
2 woodnaonly 2021-01-17 16:02:03 +08:00 via Android 依赖 jar 不编译 |
3 xcstream 2021-01-17 16:44:05 +08:00 private class |
4 john6lq 2021-01-17 19:14:42 +08:00 via iPhone 原谅我题目都看不太懂 |
5 loshine1992 2021-01-17 19:34:23 +08:00 这个问的是 ButterKnife 等使用 APT 的库的原理 |
6 zpxshl OP @loshine1992 大佬,能稍微展开讲讲吗? 我看了 ButterKnife 的原理,生成 r2 和代码,r2 只是为了让编译通过(注解不能使用变量,因此不能用 R )。 生成的代码里面还是使用了 R.id.xxxx 。 可这和题目有啥关系... |
7 nnqijiu 2021-01-17 21:07:14 +08:00 编译中生成的类是啥意思? |
9 liuzhedash 2021-01-17 22:04:21 +08:00 问就是反射 |
10 fox0001 2021-01-17 23:05:21 +08:00 via Android 编译生成的类,继承已生成的父类或者接口,可以不?除了把数据编译进方法中,没想到有什么好处… |
11 twoyuan 2021-01-17 23:32:10 +08:00 应该是 #1 、#5 说的类似 ButterKnife 实现的这种方式,根据注解生成了类,实际对生成的类调用时使用反射。 很久不用这个库了,可以顺着 ButterKnife.bind 入口往里翻就能找到答案(如果它没改实现方案的话) |
12 Guaidaodl 2021-01-17 23:42:48 +08:00 通常来说这种问题有两个方向. 一个是注解(Annotation), 另外一个是 Ttransform. 1. 注解的处理流程是在编译之前的. 所以其实你就直接引用你要生成的类就好. 因为注解在编译前处理, 所以编译是可以正常通过的. 如果不想在 build 之前 Android Studio 显示错误的话, 通常偷取一个接口和一个工厂类 /方法, 里面会用放射的方式来创建实现类. 2. Transform 流程可以直接修改字节码, 是在编译成 class 文件后进行的. 这里通常就是反射加工厂了. 还有一种可能是 SPI. 不过 SPI 的实现通常都是手写的实现的. 很少是编译期间生成的. |
13 zpxshl OP @twoyuan 感谢,明早我看下 bufferknife 的源码,之前对它的分析停留在几篇文章上...... |
14 lxilu 2021-01-18 00:50:03 +08:00 via iPhone 什么叫不能先编译? |
15 kingfalse 2021-01-18 08:22:41 +08:00 via Android 运行时动态编译? |
16 Cabana 2021-01-18 09:01:32 +08:00 via Android 1,接口 2,反射 |
17 wjploop 2021-01-18 09:45:38 +08:00 编译前和编译后处理的对象分别是*.java 和*.class,这里要求编译前,可以使用解析 java 文件的库[javaparser]( https://javaparser.org/),类似 Jsoup 于*.xml |
18 unco020511 2021-01-18 14:23:44 +08:00 对不起,我连题目都没看明白 |
19 Anarchy 2021-01-18 18:55:03 +08:00 via Android 编译中生成的只是 ide 不提示你知道也可以写代码正常走编译流程。如果是动态加载的就搞个中间类反射调用。 |