关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细。
今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦!
1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。
2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知道类名,你怎么反射啊?
那么接下来在讲讲new和反射本质上的区别,new属于静态编译,而反射属于动态编译,意思就说只有到运行时他才会去获得该对象的实例,可能讲的有些抽象(也有可能讲的不太正确)
举例:spring框架是事先就写好的框架,他内部的处理并不知道用户要写哪些类,应为那是以后由用他的人来定的,这时候你还能在spring内部去new吗?所以用户在用的时候才去配置文件中配置类路径,这是一个典型反射的例子,在很多面试中就问道了这个问题。
静态编译和动态编译的区别:来自网上,借花献佛,
静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。你写小程序没问题,但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力了。。大多数ppc的硬件配置还是很一般的。
动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。
简单的打个比方,我写个阅读器,支持txt,pdf,udm三种格式,暂时把读txt,读pdf,读udm定义为三个功能模块。 使用静态编译:我想看个txt,点击应用程序图标以后三个功能都加载进来了,判断格式,使用读txt模块。(在这里,另外两个模块的作用就是占用系统资源) 使用动态编译:我想看个txt,点击应用程序,判断格式,只加载读txt模块,使用读txt模块。
显然,动态编译1速度快,2节省了系统资源,3利于今后拓展。
解释2 静态编译的话 exe文件运行的时候不会用到别的文件 动态编译 exe文件就要用到别的文件了
解释3 一个是租自行车,什么时候骑什么时候租,有新车就租新车,没新车就租旧车,有电动车就省点劲,碰上没车座子的就扎屁股,人家不出租了你就别用了。 一个是自己买个自行车天天扛着,进电梯上地铁也扛着。老子自己的 ...
解释4 用静态链接库编译,相当于你带着一个工具包到处跑(遇到有需要的地方不需要周围的环境提供相应的工具,自己用自己工具包的工具就行了,所以当环境发生变化可以尽可能的无视),当然,你本来不带任何东西走到哪是哪和工具包随身带的区别显然就是重量增加了,即程序的体积可能会比另一种方式来的大一点,看你的工具包有多大。