反射和new使用场景?
反射的部分使用场景
- Spring通过反射来帮我们实例化对象,并放入到Ioc容器中
- 使用JDBC链接数据库时加载数据库驱动Class.forName()
- 逆向代码 例如反编译 4.利用反射,在泛型为int的arryaList集合中存放一个String类型的对象
new 对象和反射的区别
- new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符。
- new必须要知道类名,而反射创建对象不需要知道类型也可以创建
本质区别:new属于静态编译,而反射属于动态编译,意思就说只有到运行时他才会去获得该对象的实例,可能讲的有些抽象(也有可能讲的不太正确)
举例:spring框架是事先就写好的框架,他内部的处理并不知道用户要写哪些类,应为那是以后由用他的人来定的,这时候你还能在spring内部去new吗?所以用户在用的时候才去配置文件中配置类路径,这是一个典型反射的例子,在很多面试中就问道了这个问题。
静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。你写小程序没问题,但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力了。。大多数ppc的硬件配置还是很一般的。
动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。
效率
通过new创建对象的效率比较高。
通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。