一个类内部私有的方法不能通过new来调用,一般都是使用get,set方法来获取内部对象;
但是通过Class.forName(类名)是可以做到的,但是要牺牲性能。
另外,类加载的过程分为静态加载和动态加载两种;
记载编译就是一个将java文件class化的过程;
new关键字创建的对象是一个引用,但其实并不是类本体,是spring初始化时,扫描需要静态加载的类生成的,从始至终一直在容器里存活,即拿即用,但是代码需要被全部加载,及时你要用的只有一个类;
反射机制是动态加载,需要一个类对象的时候,Class方法执行后,会生成这个对象并加载到容器内。
因为很多jdk内置的类在环境内就是以字节码格式存储着,反射直接对这些class文件反编译获得类的对象即可。
比如有两个类A1,A2;
两个类作用等价,效果不同,如果我用的是A1,则newA1,后来需求变更,用A2,则把A1注掉,重写new一个A2。emmmm。
而反射呢,Class.forName(A1)-->Class.forName(A2)就好了,当然有人会说这不还是改代码吗,这只是举例子,我完全可以通过配置文件或者数据库,因为Class.forName()参数是个字符串,我是可以用过恰当渠道做到可配置的,而new不行。
对于程序的开发模式之前一直强调:尽量减少耦合,而减少耦合的最好做法是使用接口,但是就算使用了接口也逃不出关键字new,所以实际上new是造成耦合的关键元凶。