运行时类型信息(Run-Time Type Identification)使得你可以在程序运行时发现和使用类型信息。

14.1 为什么需要RTTI

Circle,Square,Triangle三个类都继承自抽象类Shape,现有一个List<Shape>的数组,存的是Circle,Square,Triangle的对象,当你拿出一个对象时,你只知道它是Shape类,但不知道它的具体类型。使用RTTI,可以查询某个Space引用所指向的对象的具体类型。

14.2 Class对象

Java使用Class对象来执行其RTTI,它包含了与类有关的信息。每一个类都有一个Class对象,被保存在同名的.class文件中。为了生成这个类的对象,运行这个程序的JVM将使用被称为“类加载器”的子系统。

所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。因此,Java程序在它开始运行之前并未被完全加载。其各部分是在必需时才加载的。

类加载器首先检查这个类的Class对象时候已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class文件。一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。

package typeinfo;

class Candy { static { System.out.println("Loading Candy"); } }

class Gum { static { System.out.println("Loading Gum"); } }

class Cookie { static { System.out.println("Loading Cookie"); } }

public class SweetShop {
    public static void main(String[] args) {
        System.out.println("inside main");
        new Candy();
        System.out.println("After create Candy");
        try {
            Class.forName("typeinfo.Gum");//书上没有加包名,亲测需要加
        } catch (ClassNotFoundException e) {
            System.out.println("Couldn't find Gum");
        }
        System.out.println("After Class.forName(\"Gum\")");
        new Cookie();
        System.out.println("After create Cookie");
    }
}
typeinfo.SweetShop.java

相关文章:

  • 2022-02-20
  • 2021-12-01
  • 2022-02-10
  • 2021-04-01
  • 2022-01-07
猜你喜欢
  • 2022-02-17
  • 2021-05-19
  • 2022-01-14
  • 2018-08-19
相关资源
相似解决方案