Java中Class类与RTTI

来源:互联网 发布:mac os x 10.9.5 编辑:程序博客网 时间:2024/06/11 21:29

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

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");    
原创粉丝点击