zoukankan      html  css  js  c++  java
  • RTTI 阅读think in java所得(1)

    运行时类型信息使得我们可以在程序运行时发现和使用类型信息!

    主要有两种方式:1、“传统”的RTTI,它假定我们在编译时已经知道所有的类型。

            2、“反射”机制,它允许我们在运行时发现和使用类的信息。

    Class对象:java使用Class对象来执行器RTTI。每一个类都有一个Class对象,通过类加载器生成。

    类加载器步骤:1、检查这个类的Class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class文件。在这个类的字节码被加载时,它会接受验证,以确保它没被破坏或者含有不良的java代码。

           2、一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

    所有的类都在对其第一次使用的时候动态加载到JVM中,当程序创建第一个对类的静态成员的引用的时候,就会加载这个类。这个证明构造器也是类的静态方法,所以new操作符创建类的新对象也被当做对类的静态成员的引用。java程序在开始运行之前并非完全被加载,其各个部分在必需时才会被加载(动态加载)。

    Class.forName(String className):这个方法是Class类的一个static成员,是获得对象引用的一种方法(立即进行初始化)。只要你想在运行时使用类型信息,就必须获得对恰当的Class对象的引用。但是你已经拥有了感兴趣的类型对象,可以通过getClass()方法来获取Class引用,返回该对象的实际类型的Class引用。

    Class.newInstance(): 实现“虚拟构造器”的一种途径,使用该方法创建的类,必须带有默认的构造器

    类字面常量:java提供的另一种获得Class对象引用。编译时就能受到检查(不需要置于try语句块中),根除了对forName()的调用,更加安全高效。

          不仅可以应用于普通的类,也可以应用于接口、数组以及基本数据类型(基本数据类型还有个标准字段TYPE,是一个引用,指向对应的数据类型的Class对象)

          使用类字面常量创建对Class对象的引用时,不会自动的初始化该Class对象

    为使用类而做的准备工作包括:1、加载。由类加载器完成,查找字节码,并从字节码中创建一个Class对象。

                  2、链接。验证类字节码,为静态域分配存储空间,如果必需的话,为解析这个类创建的对其他类的所有引用。

                  3、初始化。如果该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化块。(对于static final值这种编译期常量,是不需要将类进行初始化就可以访问的;

                                                对于一个static不是final的,那么对它进行访问时总是要求它被读取之前进行链接和初始化。)

    向Class引用添加泛型语法的原因仅仅是为了提供编译期类型检查。?extends 限定为该类型或者该类型的子类。

    Class.getSuperClass(): 获得该类的父类Class对象的引用,注意需要这样申明 Class<? super Son> father = son.getSuperClass(); 而Class<Father> 这样申明不被接受;并且 father.newInstance()

                的返回值不是精确类型,而是Object。
     

    Class.isInstance(Object obj):obj是被测试的对象,如果obj是调用这个方法的class或接口 的实例,则返回true。这个方法是instanceof运算符的动态等价
    形象地:自身类.class.isInstance(自身实例或子类实例)  返回true
    例:String s=new String("javaisland");
          System.out.println(String.class.isInstance(s)); //true
     
    Class.isAssignableFrom(Class cls):如果调用这个方法的class或接口 与 参数cls表示的类或接口相同,或者是参数cls表示的类或接口的父类,则返回true。主要用来判断继承结构
    形象地:自身类.class.isAssignableFrom(自身类或子类.class)  返回true
    例:System.out.println(ArrayList.class.isAssignableFrom(Object.class));  //false
          System.out.println(Object.class.isAssignableFrom(ArrayList.class));  //true
  • 相关阅读:
    (转载) 随机数原理
    ZOJ 2588 Burning Bridges(求桥的数量,邻接表)
    生成不重复的随机数对(C/C++)
    比较两个文件是否相同(C/C++语言)
    计算文件大小(C/C++语言)
    (转载)Nim游戏博弈(收集完全版)
    将一串字符串全排列输出(回溯法)
    Linux中使用Crontab定时监测维护Tomcat应用程序的方法
    Nginx单向认证的安装配置
    非关系型数据库 2017-02-12 22:27 189人阅读 评论(2) 收藏
  • 原文地址:https://www.cnblogs.com/nextStep/p/2561542.html
Copyright © 2011-2022 走看看