深入理解面向对象与反射
Posted lanmao123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解面向对象与反射相关的知识,希望对你有一定的参考价值。
面向对象
周志明在《深入理解JVM》一书中这样写道:在软件业发展初期,程序编写以算法为核心,程序员把数据和过程分别作为独立的个体来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思想是站在计算机的角度去抽象问题和解决问题,称为面向过程的:编程思想,而面向对象的编程思想是站在现实世界的角度去抽象和解决问题,它把数据和行为都看作是对象的一部分,这样使得程序员可以以符合现实世界的思维来编写和组织程序”
但是由于现实世界与计算机世界之间不可避免的存在一些差异,例如,人很难想象现实中的对象在一项工作期间,会被不停的中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情,因为在计算的角度,我自己一条一条的执行字节码指令(联系到数据库事物和高效并发),对于数据的改变这是很正常的事。
通俗的说就是面向过程编程更加关注的是“程序的逻辑流程”,是一种“执行者”思维,思考的是怎么一步步实现这个过程。面向对象更加关注的是程序中“各对象之间的关系”,是一种“设计者”思维,大家分工明确,各司其职。
面向对象与反射
注:以下代码均为伪代码,只为帮助理解。
我们常说类是对象的模板,对象是类的实例,比如有这样一个User类:
public class User private String name; private int age; public void sleep() System.out.println("我在睡觉");
我们将其实例化,并且为其属性赋值,实例对象为u1,此时我们说User类是u1的模板 u1是类的实例化对象
User u1 = new User("璐璐",18);
然而,站在更高维度的角度看,类何尝不也是一个对象呢?属性和方法何尝不也是一个对象呢?比如类中有这样一条属性:
private int age;
我们可以定义这样一个类:
//1.属性可以抽取成一个类 class Fileds private String modifier; //修饰符 private String ttype; //属性类型 private String fname; //属性名字
当这个类的属性实例化为modifier=private,ttype=int,fname=age的时候,不就是上面那条属性吗?同样我们可以抽取一个类(Class)来表示类的共同特征,一个该类的具体对象存储了一个类的所有的信息
class Tclass private Filed[] fs; private Method[] method; private Constructor[] constructor;
这个模板很多人称其为类对象 即用来创建类这个对象的模板,很多人在学反射的时候,老师常常说的一个模具或者设计图就是这个类对象,很多人不理解反射怎么创建对象。还是拿这个例子来说,在我们有了User类的情况下,如果我知道u1这个对象的某些属性或者方法,比如它的姓名和年龄那么我是不是就可以实例化出这个对象?答案是肯定的。同理,假设我有了一个类的模板Tclass,现在要创建一个类就很简单了,我只需要知道我要创建的类有哪些信息就可以了,因此在运用反射的时候,我们是不是都会写一句
Class cla01=User.class;
或者是
Class cla02=Class.forName("com.rjb.pojo.User");
总之就是要获取到我要创建的类的信息(比如类的属性、方法、返回值等等,当然还有一些我们不可见的信息),然后我就可以利用这个类模板Tclass和通过反射获取到的类信息创建一个类。这样反射是不是就很容易理解了?并且对万事万物皆对象有了更深的认识?
当然在JAVA底层,类对象并不是指这样的模板,这样解释仅仅是为了让大家换一种思维去思考面向对象和反射,更容易理解而已,事实上,在java底层,反射技术依靠的是字节码生成技术实现的,而不是我上面说的Tclass这个类,可以参阅《深入理解JVM虚拟机》9.2.3 字节码生成技术与动态代理实现。
以上是关于深入理解面向对象与反射的主要内容,如果未能解决你的问题,请参考以下文章