如题。 某大厂的面试题, 求大佬指点下思路或者给个关键字。
1
skyinu 2021-01-17 15:54:56 +08:00 via iPhone 1
写一个中间类提供给外部调用?中间类自己反射调用生成类?
|
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 1
这个问的是 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
应该是 #1 、#5 说的类似 ButterKnife 实现的这种方式,根据注解生成了类,实际对生成的类调用时使用反射。
很久不用这个库了,可以顺着 ButterKnife.bind 入口往里翻就能找到答案(如果它没改实现方案的话) |
12
Guaidaodl 2021-01-17 23:42:48 +08:00 2
通常来说这种问题有两个方向. 一个是注解(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 不提示你知道也可以写代码正常走编译流程。如果是动态加载的就搞个中间类反射调用。
|