PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 需要用反射的时候自然会用。反射肯定是能不用就不用。两种需要用反射的情况: 1)方法名,甚至类名,是从某些配置文件读出来的,这时候就需要用。更甚有些类直接就是动态生成的,比如gclib,那肯定要用反射 2)框架,比如spring,junit,大量需要用到反射做各种骚操作 3)不推荐在生产使用:需要访问private的属性和方法。
作者回复: 访问private要设置一下accessible为true。还是有点限制的。private确实不应该被访问,但是总有特殊情况,就好像车不应该闯红灯,但是总有特殊情况,如果在红灯的时候直接在路口升起一堵墙,消防车救护车也不让过,也并非是好事。当一个人把属性设置为private的时候,也很难考虑到所有可能的情况。 偷偷告诉你,其实我是德云社的编外弟子 :-) 手动狗头🐶
作者回复: Class.forName:就是加载一个类,但是这个类只有在用到的时候才会被初始化,初始化你可以认为就是执行static的初始化代码,以及检查这个类用到的别的类是否存在之类的。 对象.getClass和类名.class我感觉没啥区别。他们返回的类肯定都是已经初始化好的。如果说一定要有点区别的话,那也是最表面的区别。getClass方法是调用对象的方法,那么首先必须得有一个对象才行。.class是直接获取某个类的class,不需要通过对象。 如果非要再说有啥区别,就跟classloader里各种弯弯绕有关系了,对象.getClass和类名.class得到的class instance可能会不一样,但是这些弯弯绕我觉得没啥意思。应该也不是面试官考察的内容。
作者回复: 尽量不要使用非LTS版本的JDK https://github.com/geektime-geekbang/LetsJava/blob/master/FAQ/01%E7%AB%A0-Java%E7%89%88%E6%9C%AC%E9%82%A3%E7%82%B9%E4%BA%8B%E5%84%BF.md
作者回复: 是的,private方法在本类之外都是不可见的。也无法覆盖。
作者回复: 反射是可以改值的,就会导致instace的内容变化。
作者回复: 反射是为了灵活。比如调用一个你也不知道是不是有的方法。在框架中会大量用到反射。
作者回复: 是的,private怎么访问后面有介绍
作者回复: m.invoke(t,100)是对的 m.invoke(t.gS(10));不对,应该参考上门的,第一个参数是t,第二个参数是100,而不是“t.gS(10)”
作者回复: describeColorPhone的describe方法在调用的时候,参数必须是这个类的实例。所以1处才会出错。 第二个问题,底层并非是直接等价的。但是效果一样