RTTI

来源:互联网 发布:白话文翻译文言文软件 编辑:程序博客网 时间:2024/06/02 00:22
Java使用Class对象来执行其RTTI,即使你正在执行的是类似转型这样的操作

Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的(由类加载器进行加载)

static成员在类第一次被加载时执行
static初始化是在类加载时进行的

Class对象就和其他对象一样,我们可以获取并操作它的引用。
forName()是取得Class对象的引用的一种方法

Class.forName()找不到你要加载的类,它会抛出异常ClassNotFoundException

Class对象支持的操作:
getName()
isInterface()
getSimpleName()
getCanonicalName()
getSuperClass()

使用".class"也可获得Class对象的引用,但是不会自动初始化该Class对象(Class.forName()会)

为了使用类而做的准备工作:
1、加载。这是由类加载器执行的。该步骤将查找字节码(通常在CLASSPATH所指定的路径中查找,但这并非是必需的),并从这些字节码中创建一个Class对象;
2、链接。在链接阶段,将验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用;
3、初始化。如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。初始化被延迟到了对静态方法(构造器隐式地是静态的)或者非常数静态域进行首次引用时才会执行

如果一个static域不是final的,那么在对它访问时,总是要求在它被读取之前要先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间)

Class引用总是指向某个Class对象,它可以制造类的实例,并包含可作用于这些实例的所有方法代码。它还包含该类的静态成员,因此,Class引用表示的就是它所指向的对象的确切类型。而该对象便是Class类的一个对象

为了创建一个Class引用,它被限定为某种类型,或该类型的任何子类型,你需要将通配符与extends关键字相结合,创建一个范围。
Class <? extends Number>
newInstance()
cast()

关键字instanceof,返回一个布尔值,告诉我们对象是不是某个特定类型的实例
if ( x instanceof Dog)
    ( (Dog) x ).bark();

Class.isInstance动态测试对象

在查询类型信息时,以instanceof的形式(即以instanceof的形式或isInstance()的形式,它们产生的结果)与直接比较Class对象有一个很重要的差别:
    instanceof保持了类型的概念,它指的是“你是这个类吗,或者你是这个类的派生类吗?”
    而如果用== 或equals()比较实际的Class对象,就没有考虑继承——它或者是这个确切的类型,或者不是

Java通过JavaBeans提供了基于构件的编程架构

Class类与java.lang.reflect类库一起对反射的概念进行了支持

RTTI和反射之间真正的区别只在于,对RTTI来说,编译器在编译时打开和检查.class文件。(换句话说,我们可以用“普通”方式调用对象的所有方法)而对于反射机制来说,.class文件在编译时是不可获取的,所以是在运行时打开和检查.class文件

Class的getMethods()和getConstructors()方法分别返回Method对象的数组和Constructor对象的数组

反射机制可以调用类的私有方法

0 0
原创粉丝点击