昨天面试南京 xx 生活, 面试官是一个业务架构师。
笔试有一道题目:怎么自定义 java.lang.String 类,从类加载器角度阐述。 我说自定义不行, 首先不允许 java.xxx 开头的包, 其次根据类加载机制, string 类已经加载了, 就不允许再自定义加载。哈哈哈结果把我 diss 一遍说可以的,你回去试试。就让我回去了。
然后今早面试反馈基础不行,过往项目经验不足。😂好歹做了几年日均交易几百万的系统,真的服气。
1
saluton 2019-02-28 21:18:01 +08:00 1
双向选择,双向选择,膜拜大佬
|
2
xuanchi 2019-02-28 21:18:30 +08:00
这个种问题如果是做代码覆盖率、插桩中专业领域才能够回答的让对方服气,做业务的就算能够回答上,没有实际操作也就是看看博客,就算能够回答上,又有什么用处呢?
被怼很正常,平常心 |
3
wwfengqi 2019-02-28 21:21:04 +08:00 via Android
哈,艾佳生活吧
|
6
dongisking 2019-02-28 21:32:18 +08:00 via Android 1
毕竟他是面试官,也很可能以后是你的上司。你这么说他以后估计没得混的了。所以你懂的,面试要扮猪吃老虎
|
7
10Buns OP @dongisking 可能我太耿直直接说题目错了😂但是的确没发实现啊。还让我抛弃 ioc 选择一个更好的方案,我说实际没操作过,但是 ioc 原理和伪代码我可以写一下,结果说对就是说下这个。😂这不是误导别人么
|
8
Ico945 2019-02-28 21:38:37 +08:00
双亲委派这种东西都问烂了他居然不知道有点不信(狗头··)
|
10
lhx2008 2019-02-28 21:47:58 +08:00
这个我还是持保留意见,首先,自定义类加载器是可以不进行父类委托(或者叫双亲委派)的,虽然 Jvm 已经把 java.lang.String 加载了,但是应该还是有办法加载自定义 String 类进来的,不过当然无法替换原来的 String 类。
|
11
lhx2008 2019-02-28 21:57:49 +08:00
当然,自定义加载进来的 String 类,只能通过反射初始化和调用函数,因为默认会执行到的是原来的类。
|
12
lhx2008 2019-02-28 21:59:08 +08:00
当然,实际过程中还有其他 JVM 的限制,不过类加载器这里是可以绕过的,父委托不是必须的。比如 Tomcat 的类加载器就不遵循父委托。
|
13
Cbdy 2019-02-28 22:14:11 +08:00
类加载这个,我表示怀疑
我没有试过加载 java.lang.String。但是 JVM 区分两个加载到 JVM 里的类的唯一性,是通过:类加载器+全限定名。所以可以加载两个同全限定名的类到同一个 JVM,只要是两个不同的加载器加载的。 |
14
10Buns OP @lhx2008 打破双亲委派模型我知道,但是在 jvm 的中不是限制必须由 bootstrp 来加载 java.*开头的类么? 麻烦详细解释下,这一块可能是我理解有问题
|
15
lhx2008 2019-02-28 22:17:55 +08:00 via Android
@10Buns 确实,按照规范,java.*是加载不进来的,但是我觉得那个面试官可能不是想问你这个吧。。哈哈
|
16
lhx2008 2019-02-28 22:21:49 +08:00 via Android
@10Buns 还有另外一种思路,就是用 CGLIB 或者 ASM 动态生成一个子类,这个子类是继承 String 类的,这样子用这个子类创建的类可以用 String 修饰,可以达到所谓修改 String 类的效果,而且不需要 java.*的名字。不过,String 类是 final 的,理论上是无法被继承的,我不太清楚 ASM 或 CGLIB 能否绕过这个限制
|
17
zmj1316 2019-02-28 22:22:25 +08:00 via Android
非要做的话,自定义一个 JVM 总行吧🤣不过可能就是 CPP 了
|
18
chenguoyu 2019-02-28 22:24:38 +08:00
我也对这个持有保留意见,我刚还翻了深入理解 java 虚拟机看了一下,他只说 bootstrap 类加载器根据名称加载。而且双亲委派模型的例子还是 java.lang.object。
|
19
eaglewangl37670 2019-02-28 22:50:31 +08:00 via Android
@lhx2008 有点疑问,String 类不是被 final 修饰了吗,那应该是无法被继承了,你说的继承子类是?
|
20
lhx2008 2019-02-28 23:00:24 +08:00 via Android
@eaglewangl37670 可以的,只是我们自己写的代码是不行的。具体你可以搜索一下 asm 或者 cglib 绕过 final,这个应该也挺常用到的(比如 AOP )。但是呢,改 jdk 类这个,我还真没试过。
|
21
mmdsun 2019-02-28 23:03:37 +08:00 via Android
意思是让你定义一个 your.packge.MyString 的类,做到能和 java.lang.String 一样的效果 ? 如果不是这个意思多半说明面试官水平很差。(考察太深)(或者说让你设法绕过双桥委派机制,可参考 Tomcat 源码
|
22
Miiiz 2019-02-28 23:05:08 +08:00
可以可以,可以不去面试了
|
23
ofblyt 2019-03-01 08:40:46 +08:00
面试者的目的不一定是展示自己的技术水平,技术只是综合能力的一方面,面试者的目的应该是得到面试官的认可
|
24
alvinbone88 2019-03-01 09:21:57 +08:00
那么问题来了,Android SDK 是怎么做到加载自定义 java.lang.Sting 类的
顺便放个 Android SDK 里 java.lang.String 的源码 https://github.com/AndroidSDKSources/android-sdk-sources-for-api-level-28/blob/master/java/lang/String.java |
25
alvinbone88 2019-03-01 09:35:39 +08:00
……发完贴才发现编译能过,加载不是由标准的 JDK 来做的
|
26
ukyoo 2019-03-01 10:18:19 +08:00
艾佳生活...
|
27
sioncheng 2019-03-01 16:17:57 +08:00
|