一直以来,多少Java编程人员对于Java的反射讳莫如深,其实简单粗暴的说,所谓反射就是文件与Java对象之间的转换而已。
我们编写的Java后缀的文件,经过编译之后就成为class后缀的文件了,jvm对其进行登记。
反射的时候,jvm按照花名册,加载所有相关的class文件。这时候,文件里面就是代码,就是对象。
加载之后呢,按照Java规则,将其还原为我们熟悉的Java文件,这时候这个class文件就从编译状态变成了编程状态。
实际反射的根本就是文件io。在这个基础之上,必须理解的是,Java的一切皆是面向对象,连基本数据类型都有对象包装类。
1.获得一个类的类模版
Class c =对象名.getClass();
Class c = Class.forName(包名+类名); ---常用
我们也可以根据模版来获取其对应的类对象:c.newInstance();
上面就是从jvm加载的花名册里面获取到class文件,然后调用面向对象的方法,生成对象,class就是编译后的class文件对应的对象类型。
重点:Class是一个对象。
2.根据类模版获取类的信息:
获取类的属性:
Filed类----c.getFiled(String pname)获得指定属性(公共字段)
Filed类----c.getDeclearedFiled(String pname)获得指定属性(所有权限字段)
Filed[]----c.getFileds()获得所有属性(公共字段)
Filed[]----c.getDeclearedFileds()获得所有属性(所有权限字段)
上面是基于对象获取属性与字段。
重点:属性本身也是一个对象。
获取类的方法:
Method类----c.getMethod(String methodName,class[] params)获得指定方法(公共方法)
Method类----c.getDeclearedMethod(String methodName,class[] params)获得指定方法(所有方法)
Method[]----c.getMethods()获得所有方法(公共方法)
Method[]----c.getDeclearedMethods()获得所有方法(所有权限方法)
获取类的方法,一样是基于对象操作;
重点:方法本身也是对象。
所以,必须深刻的理解Java的面向对象的彻底与干脆。
所以反射的本质,就是从Java格式的对象文件到编译的class文件,然后从编译的class文件到可编程的Java文件,我们看得懂的对象文件。编译的过程就是文件重写,从一直规则到另一种规则。反射的时候,就是通过IO进行反向规则还原写。还原的过程,一切都是从文件到对象的过程。理解类是对象,属性是对象,方法是对象。