• 深入理解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虚拟机》
  • 相关阅读:
    30个php操作redis经常用法代码样例
    Android语音播报、后台播报、语音识别
    Gym 100733J Summer Wars 题解:灵活运用扫描线的思想
    如何运营一个软件微社区
    关于迭代测试的一些思考
    DirectUI界面编程(五)WindowImplBase的使用
    Zxing实现在线二维码生成程序
    Java二维码生成与解码工具Zxing使用
    DirectUI界面编程(四)界面布局详解
    软件开发中的资源管理
  • 原文地址:https://www.cnblogs.com/lanmao123/p/11139202.html
Copyright © 2020-2023  润新知