一.定义
反射机制:程序可以访问,修改它本身状态或行为的能力,并根据自身行为状态,进行调整或修改。
分类:传统RTTI:编译期
反射机制:运行期
反射的功能:判断类,属性方法,创建对象,调用
对反射的理解:底层防止占内存的一种机制
二.Class类
每个类都有一个对应的Class类,封装了当前类的信息。
平时创建对象是利用类的构造器。Class类里面封装了类的信息,包括构造器,所以也可以用来创建对象,但也因此多了一个获取构造器的过程。
Class类在类加载时自动生成。
与*.class字节流文件不同,Class类不仅封装了类的信息,还包括一些物理信息。更偏重底层。
Class创建对象返回的是obj类型需要强转。
三.生成Class对象的三种方式
- Class.forName("类的完整名:包名+类名");
- Class c=Student.class----------类名.class的方式创建对象
- 对象.getClass();---------------getClass()方法时obj的方法
- 由JDBC我们知道了他们的区别是:*.class的方式不加载类;而forName和getClass的方式加载了类。
四.创建对象的具体内容
1.*.class方式创建对象:
Class c=Student.class; Student s=(Student)c.newInstance(); //c.newInstance()可以创建类对象,返回object方法,实际上调用的是无参构造器。没有无参构造器会报错。运行时报错
2.获取构造器的方式创建对象
分为四种情况,所有构造器,一个构造器,所有权限,公共权限
c.getConstructors(); //获取所有public构造器 c.getConstructor(double.class); //获取一个public权限的构造器 c.getDeclaredConstructors(); //获取所有权限的所有构造器 c.getDeclaredConstructor(); //获取指定权限的一个构造器
Class c=Student.class; Student s=(Student)c.newInstance(); Constructor con=c.getConstructor(); con.setAccessible(true);//必要时,打开权限 con.newInstance(5,"sss");
五.获取对象的属性和方法
- 普通方法
c.getMethods();//包括父类的方法 c.getMethod("func1",String.class);//包括父类 c.getDeclaredMethods();//没有父类的 c.getDeclaredMethod();//没有父类的 m.setAccessbile(true);//必要时 m.invoke(obj);//参数为调用这个方法的对象。 //该方法的返回值为调用方法的返回值
- 静态方法
Method m=c.getDeclaredMethod(); m.invoke(null);//静态方法传至传null就行,因为还没有对象
- 属性
Student s=(Student)c.newInstance(); Field f=c.getField("name"); System.out.println(f.get(s));//打印某个学生的名字属性 //大致同方法
- 补充:类型判定 xxx isInstance(xxx) 和 xxx instanceof xxx
Class c=Person.class; c.isInstance(new Student()); student instanceof Person; syso(c instanceof Person);//boolean类型 //如果类型不兼容,直接报错