Java 反射简析

  一直以来,多少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进行反向规则还原写。还原的过程,一切都是从文件到对象的过程。理解类是对象,属性是对象,方法是对象。


你可能感兴趣的:(Java 反射简析)