Java中Class类与RTTI

…本人小白一枚,希望各位大侠批评指正^_^

RTTI

RTTI(Run Time Type Information),运行时类型信息

First : why?

Java运行时系统需要准确地知道每个对象实例的类型信息(属于哪一个类等等),于是将一个类的信息用另一个类包装起来,用于包装一个类的信息的类就是Class类。

这里写图片描述


Second : what?

首先抛出一些概念:
add1:什么是java运行时系统?
运行java应用程序所需的系统环境,可以大致理解为JVM(Java Virtual Machine).Java是一种典型的解释型语言,需要借助虚拟机来运行java编写的程序.当一个Java的源程序编写好后,将会被编译成字节码文件(.class文件),然后JVM就负责运行这些字节码文件.
add2:什么是类加载器(Class Loader)?
 $1.类加载器: 顾名思义,负责把需要的类加载到JVM。(一旦程序需要用到某个类时,就通过类加载器将对应的.class文件从外存中调入)当一个类被加载时,就会创建一个Class对象,用于封存关于这个类的信息.

 $2.类加载器的类型:
    1)引导类加载器(bootstrap class loader):加载 Java 的核心库。

    2)扩展类加载器(extensions class loader):加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。

    3)系统类加载器(system class loader):根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。

    4)自定义类加载器:通过继承 java.lang.ClassLoader 类的方式实现自定义的类加载器。

继承关系:引导类加载器<--扩展类加载器<--系统类加载器<--自定义类加载器
add3:什么是Class类?
$1.把它看做一种比较特殊的类,用于保存一个类的信息,比如说一个类的名字啊、方法啊、父类是谁啊……等等。这个类只能由JVM自动创建,自己是不可能创建一个Class对象的。

$2.这个类常用的方法?
  1)public static Class<?> forName(String className):参数是一个类的名字(package path),返回该类的Class对象引用。

  2)public T newInstance():创建此 Class 对象所表示的类的一个新实例。  

  3)public native Class getSuperclass():获取类的父类

  4)public ClassLoader getClassLoader() :获得类的类加载器。

  5)public String getName() :获取类或接口的名字。enum为类,annotation为接口。

  6)public Constructor<?>[] getConstructors() :获得所有的构造函数。

  7)public Field[] getFields() :获得域成员数组。    

  8)public Method[] getMethods() :获得方法。

$3.特殊用法:虚拟构造器
   我只拿到一个类的名字,但是我就要准确地创建这个类的一个实例。

   举个例子:
package test1;

public class Apple{
    static{
        System.out.println("hello,I am an apple!");
    }

    public static void main(String[] args){
        try{                        
            Apple apple = (Apple)Class.forName("test1.Apple").newInstance();        
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}   
$4.泛化
  1)指明Class对象引用的类型,可以强迫编译器进行额外的类型检查                 
          Class<Apple> c = Apple.class;

  2)区分两种效果看似相同的写法

          Class c = Apple.class;

          Class<?> c = Apple.class;//相比较上面那种写法,该写法明确表示:老子是特地使用非具体类型的Class引用

  3)用Class引用指向基类的任何子类的class对象 
          Class<? extends Number> c = int.class;

  4)用子类Class对象构建父类Class对象
          Class Parent{}            //父类
          Class Child extends Parent{}      //子类

          Class<Child> c = Child.class;
          Class<? super Child> c2 = c.getSuperclass();

Third : how?

现在来讲讲怎么回事
$1.Java采用动态加载类的策略,只有一个类被需要时才会被加载.

$2.当第一次调用一个类的静态成员时,类加载器就会加载这个类,并且自动创建一个Class对象,把类的信息放进去.
    初始化Class对象,具体讲讲三个步骤:

    1)加载:由Class Loader查找.class文件,并创建Class对象;
    2)链接:验证字节码文件,为静态分配存储空间,解析对其他对象的引用;
    3)初始化:初始化父类,执行静态初始化器和静态初始化块.

$3.所有这个类的所有对象共享一个Class对象.

$4.三种方法获得Class对象(以上面的Apple类为例):
    1)获取类的静态成员变量class
          Class c = Apple.class;

    2)调用对象的getClass()方法,返回该对象对应的一个Class对象
          Class c = apple.getClass();

    3) 调用Class类的静态方法forName();
          Class c =Class.forName("test1.Apple");    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值