java基础---反射机制
资料
===概念
java反射机制是说在程序的运行过程中,对于任意一个类或者对象,都能够知道它的所有属性和方法和构造方法,能够创建新的对象;这种动态获取属性或者调用方法的功能叫做java反射机制。
对于反射来说,最重要的就是Class类,这是一种用来描述类的类。java中的每一个类都会有一个Class实例对象,用来封装这个类的信息,包括属性,接口,方法,构造函数等等。要使用反射的话都要先获取这个Class对象。
===Class对象什么时候创建的呢?被保存在虚拟机什么位置呢?
在类加载器加载的时候创建Class对象,保存在虚拟机的方法区中。
===创建Class类实例对象的方法有三种
1.通过类获取;Person.class
2.通过类的全限定名创建 Class.forName(com.java.Person);类加载器会做加载
3.通过对象获取,getClass()来创建。
4.获取当前线程的classloader来加载。
===使用Class.forName和直接通过类名获取Class对象引用有什么区别呢?
首先他们都会获取到Class对象引用,但是使用.class不会做初始化,使用Class.forName会做初始化。
类加载三个步骤:加载连接初始化。
实际上进行了三步操作:
1.虚拟机的类加载器加载了.class文件,首先查找并且导入Class对象
2.验证类中的字节码,为静态变量分配了内存空间,创建了对其他类的所有引用
3.进行初始化,进行静态初始化和静态初始化块。
===获取到Class类实例对象之后就能够调用他的一些方法,比如说最常见的就是newInstance()方法来创建一个对象,或者通过getMethod方法获取方法类对象,再调用invoke来执行方法。
Class cla = Person.class;
Object xiaoming = cla.newInstance();
===框架中如何使用反射呢?
框架中大量使用到反射机制,能够使得程序更加灵活。
举一个例子,比如说创建一个类Person,如果没有反射,那么你必须new 一个Person对象。这个时候如果person类需要修改,那么就要停下整个应用进行修改编译再运行。但是使用反射就不需要了,你只要修改配置文件就行,通过配置文件获取到对象的Class对象,然后通过Class对象的newInstance()方法来创建实例。