深入理解Java面向对象与反射

1、面向对象

  周志明在《深入理解JVM》一书中这样写道:在软件业发展初期,程序编写以算法为核心,程序员把数据和过程分别作为独立的个体来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思想是站在计算机的角度去抽象问题和解决问题,称为面向过程的:编程思想,而面向对象的编程思想是站在现实世界的角度去抽象和解决问题,它把数据和行为都看作是对象的一部分,这样使得程序员可以以符合现实世界的思维来编写和组织程序”

  但是由于现实世界与计算机世界之间不可避免的存在一些差异,例如,人很难想象现实中的对象在一项工作期间,会被不停的中断和切换,对象的属性(数据)可能会在中断期间被修改和变“脏”,而这些事情在计算机世界中则是很正常的事情,因为在计算的角度,我自己一条一条的执行字节码指令(联系到数据库事物和高效并发),对于数据的改变这是很正常的事。

  通俗的说就是面向过程编程更加关注的是“程序的逻辑流程”,是一种“执行者”思维,思考的是怎么一步步实现这个过程。面向对象更加关注的是程序中“各对象之间的关系”,是一种“设计者”思维,大家分工明确,各司其职

2、面向对象与反射

  注:以下代码均为伪代码,只为帮助理解。

  我们常说类是对象的模板,对象是类的实例,比如有这样一个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 字节码生成技术与动态代理实现。

3、反射的好处

  其实对于反射的好处,总结下来就“动态”二字。引用下面几句话说明一下:

RTTI和反射之间真正的区别只在于,对RTTI来说,编译器在在编译时打开和检查.class文件.(换句话说,我们可以用"普通"方式调用对象的所有方法).对于反射机制来说,.class文件在编译时是不可获取的,所以在运行时打开和检查.class文件。 --《编程思想》
配置性大大提高,如同Spring IOC容器,给很多配置设置参数,使得java应用程序能够顺利跑起来,大大提高了Java的灵活性和可配置性,降低模块间的耦合。--《Mybatis技术原理与实战》
动态代理中所谓的动态,是针对使用java代码实际编写了静态代理类的“静态”而言的,它的优势不在于省去了编写代理类那一点工作量,而是实现了可以在原始类和接口还未知的时候,就确定代理类的代理行为,当代理类与原始类脱离直接联系后,就可以很灵活的重用于不同的应用场景。--《深入理解JVM虚拟机》
原文地址:https://www.cnblogs.com/lanmao123/p/11139202.html