一.定义
在运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;还可以通过反射创建对象,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二.能做什么
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.运行时调用任意一个对象的方法
5.生成动态代理
三.原理,通过例子说明
public class Test { public static void main(String[] args) { //指定类名 String className = "com.template.Runable.testHello"; testHello test = null; try { //用类名根据反射创建实例,并调用实例的方法 Class th = Class.forName(className); test = (testHello)th.newInstance(); test.main(null); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
结果: 输出了我指定类里面的main函数
从执行过程说原理
Class.forName(classname):调用
forName0(className, true, ClassLoader.getClassLoader(caller), caller)
className:类名
true:初始化该类
ClassLoader.getClassLoader(caller):获取当前类加载器
caller:当前类
解释:要想使用类,必须使用类加载器进行加载,类加载器先检查自己是否已经加载过该类,加载过:直接返回,没有:调用父类的loadClass方法,父类中没有,执行findClass()去尝试从生成的.class文件加载此类,主要通过defineClass()完成,将字符数组转换成Class类,这种转换的类需要通过newInstance去创建实例,不能通过new Class实例化,注:反射是有缓存的,不会每次都去重新反射。