深入理解面向对象与反射

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 字节码生成技术与动态代理实现。

以上是关于深入理解面向对象与反射的主要内容,如果未能解决你的问题,请参考以下文章

面向对象与继承

java 面向对象(三十八):反射 Class类的理解与获取Class的实例

深入理解js面向对象中的prototype

深入理解Java面向对象三大特性 封装 继承 多态

深入理解js面向对象——创建对象

深入理解js面向对象——创建对象