定义
反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。
具体而言,反射机制的主要功能主要有:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。
反射机制的作用:
1,反编译:.class–>.java
2,通过反射机制访问java对象的属性,方法,构造方法等;
先看一下sun为我们提供了那些反射机制中的类:
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。
Class c=Class.forName(“Employee”);
Object o=c.newInstance(); 调用了Employee的无参数构造方法
方法关键字
getDeclareMethods() 获得所有的方法
getReturnType() 获得方法的返回类型
getParameterTypes() 获得属性的传入参数类型
构造方法关键字
getDeclaredConstructors() 获得所有的构造方法
getDeclaredConstructor(参数类型.class,……) 获得特定的构造方法
父类和父接口
getSuperclass() 获取某类的父类
getInterfaces() 获取某类实现的接口
这样我们就可以获得类的各种内容,从而进行反编译
反射机制获取类的方法有三种,我们分别展示如何获取Reflection包下的Student类
Class.forName(“类的路径”)
Class Student = Class.forName(“Reflection.Student”); //包名+类名
类名.class
Class Student = Reflection.Student.class;
类实例.getClass()
Student student = new Student(); Class Student =student.getClass();
Class类中的6个重要方法
1.getName()方法,返回一个String字符串,显示该类的名称。
1.System.out.println(Student.getName()); //输出: Reflection.Student
2.newInstance()方法, 由类调用该方法,根据该类的默认构造函数创建类的实例
Object o = Student.newInstance();
3.getClassLoader()方法,返回该类对象的对应的加载器。
4.getComponentType()方法,返回类的组件类型的数组,如果这个类并不代表一个数组类,此方法返回null。
5.getSuperClass()方法,返回某子类所对应的直接父类所对应的Class对象。
6.isArray()方法,判定此Class对象所对应的是否是一个数组对象。
反射机制获取类的方法
获取类的构造方法
getDeclaredConstructors() //获取类的所有构造方法
getDeclaredConstructor(参数类型.class,……) //获取特定的构造方法
获取类的普通方法
getDeclaredMethods() //获取所有普通方法
getDeclaredMethod(“方法名”,参数类型.class,……) //获取指定名称的方法
getReturnType() //获取方法的返回类型
getParameterTypes() //获得方法的传入参数类型
new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类
通过动态加载类可以解决该问题。通过类类型创建该类的对象
1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
2、new创建对象:是静态加载类,在编译时刻就需要加载所有的【可能使用到的类】。有一个类有问题(如不存在),都不能通过编译,会报错。
3、Class.forName()通过动态加载类,可以用到一个类时,才进行加载。