1、
首先先放上知乎的一段关于虚拟机的解释,
JVM是一个进程,用来跑我们写的Java代码,上面的图是一个JVM内存模型。
代码Object o=new Object();首先将代码编译成class文件,然后被类加载器加载到JVM中,类Object加载到方法区,创建了Object类的class对象(对应的是是Object类而不是对象o,每个类只有一个class对象,作为方法区类的数据结构的接口),Jvm对象创建对象前会检查类是否加载,寻找对应的class对象,若加载好再为你的对象分配内存。
反射是程序运行过程中,需要动态加载的一些类,这些类之前可能用不到,假设程序可能用到Oracle和Mysql两个数据库,需要动态地根据情况加载驱动类,这时候就可以根据类的全名让jvm在服务器中找到并加载这个类,不同的数据库传入的类名不同。
2、
以下一段来自《李兴华的Java se实战》,也是一位知乎大神总结的
理解反射之前首先要理解反这个字的含义,那“正”是什么,当用户使用一个类的时候必须预先知道这个类,然后通过这个类产生实例化对象,“反”指的是通过对象找到类。
Person p=new Person();//正着来
per.getClass.getName();//反着来
取得class对象的方法,public final Class<?> getClass(),反射中所有的泛型都定义为?,返回值是Object。getClass返回的是Class类的对象,所以这个Class就是所有反射操作的源头。
获得Class对象有三种方法:
1、Object的getClass方法,就是前面说到的
2、类名.class
3、使用Class内部定义的一个static方法,(主要使用),Class.forName()
取得了Class类对象以后,可以不依赖构造函数+new ,而使用public T newInstance(),
使用接口可以减少耦合,但是即使使用接口还是要使用关键字new,new成为耦合的元凶(意思是不管使用