java学习笔记一 java类型信息(RITI和反射)

来源:互联网 发布:手机有声朗读软件 编辑:程序博客网 时间:2024/06/07 11:56

    <Tinking in java > 类型信息  学习笔记   浅谈一些个人理解,阐述不对地方,希望大家能多多指正 !     

    java类型信息  就是 程序运行时类型的信息这些(包括 方法 属性)分为两种

    一种是 RITI  (RunTime Type information)执行时类型信息   

      要求:必须是编译时知道所有类型          

      过程:生成.class字节码  ,jvm对字节码加载( 类的加载分为三个步骤

        装载(load)连接(link) (initialize)初始化        

       第一 :装载  就是 查找并加载类的二进制(class文件)

       第二:连接 ------分为三步骤    验证 :确保类的正确性 (因为可能有人恶意的上传一个伪class文件,如果不验证 后果不可想象)

                                      准备:改类的静态变量 分配内存空间,并初始化默认值

      解析:把类中的符号引用,转为直接引用

          第三:初始化       为静态变量赋予真正的值 

      一个小例子  private static final int  b=8;  
                          这段代码编译成字节码之后 ,jvm的过程是  通过 classloader(类加载器)装载 然后 验证 确保这个类有前后关联 ,准备阶段 静态变量a 分别内存空间         int 类型默认值是0 ,让后是解析     最后初始化给b 赋予真正的值 8   整个过程就是这样)

 下面我们继续分析  RITI   它解放了程序在编译期间执行的面向类型的操作,不管是程序的安全性还是可扩展性和可维护性,都得到了大大的加强    。                                  class对象是RITI在java中工作机制的核心 无论何时,只要我们想要在运行时使用类型信息,就必须获得恰当的class对象的引用。常规来讲

       class对象有三种获得方式

      Class.forName():最简单的,也是最快捷的方式,因为我们并不需要为了获得class对象而持有该类的对象实例 

     obj.getClass():当我们已经拥有了一个感兴趣的类型的对象时,这个方法很好用。

     Obj.class :  类字面常量,这种方式很安全,因为它在编译时就会得到检查(因此不需要放到try语句块中),而且高效。     

        那么什么是class引用 ,我认为 class引用表示的是它指向对象的确切类型,并且通过class对象我们 能获取特点类的几乎所有信息,

         instanceof 关键字  是判断该对象是否是改类型的实例   布尔类型            

动态的instanceof

          instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化。如果被测对象是null值,则测试结果总是false    

 而且instaceof 是为instaceof操作       多用于多态中判断是否是该类型或该类型的父类,比较的两者要么有类型对等的关系要么有继承的关系,没有关系的两者进行比较,编译是无法通过的。  

   这里插一段 java对象实例有五种方式  

     1. 用new 创建一个对象 最常见的 Object obj=new Object();

     2.用工厂方法返回一个对象  String s=String.valueof(a);

    3、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance(); 

  4、调用对象的clone()方法。
  5、通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

   第二种 是反射机制     

     原理 :JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制         

    那么是因为什么 我们需要它? RITI不是更安全吗 ?

     起因:在大型项目开发里面 我们可能 是基于构件的编程、还有可能是用某种基于快速开发(RAD)的应用构件工具,即集成开发环境(IDE)远程方法调用(RMI) 分布式开发  (可以将一个java对象分部到多台机器上)这些RIIT都支持不了 因为不能编译完之后再检查,这些都是运行或者说是即时信息,只有运行时 才能确定   

     过程 :要解决这个问题 java  可以用lang包下的reflect 反射 包含field 、Method、Constructor 类(每个类都实现了Member接口)

    在jvm运行时创建,用以表示未知类里对应的成员 步骤 

    a Construstor创建新的对象,用get(),set()方法读取和修改filed对象关联字段 

    b 用invoke()方法调用与method对象关联的方法 还可以调用getFileds()、getMethods()和getCntructors()很便利的方法,以返回表示字段、方法以及构造器的对象数组  

  那么RITI和反射二者区别 就不言而喻了 

     对RITI来说,编译器在编译时打开和检查.class文件(换句话说,我们可以用普通方式打开对象所有方法),对于反射机制来说 .class文件在编译时时不可获取的,所有在运行时打开和检查.class文件 

  还有一个我们熟知的 代理模式 这个在后期会发表一下看法

  

                              

0 0
原创粉丝点击