一直以来,多少Java编程人员对于Java的反射讳莫如深,其实简单粗暴的说,所谓反射就是文件与Java对象之间的转换而已。 编程
咱们编写的Java后缀的文件,通过编译以后就成为class后缀的文件了,jvm对其进行登记。 jvm
反射的时候,jvm按照花名册,加载全部相关的class文件。这时候,文件里面就是代码,就是对象。 spa
加载以后呢,按照Java规则,将其还原为咱们熟悉的Java文件,这时候这个class文件就从编译状态变成了编程状态。 对象
实际反射的根本就是文件io。在这个基础之上,必须理解的是,Java的一切皆是面向对象,连基本数据类型都有对象包装类。 get
1.得到一个类的类模版 io
Class c = 对象名.getClass(); 编译
Class c = Class.forName(包名+类名); ---经常使用 class
咱们也能够根据模版来获取其对应的类对象: 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进行反向规则还原写。还原的过程,一切都是从文件到对象的过程。理解类是对象,属性是对象,方法是对象。