当前位置: 首页 > 编程笔记 >

Java进阶教程之运行时类型识别RTTI机制

荆运诚
2023-03-14
本文向大家介绍Java进阶教程之运行时类型识别RTTI机制,包括了Java进阶教程之运行时类型识别RTTI机制的使用技巧和注意事项,需要的朋友参考一下

运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。

多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。

Class类

Class类是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合。

每一个Class类的对象代表一个其他的类。比如下面的程序中,Class类的对象c1代表了Human类,c2代表了Woman类。


public class Test

{

    public static void main(String[] args)

    {

        Human aPerson = new Human();

        Class c1      = aPerson.getClass();

        System.out.println(c1.getName());

        Human anotherPerson = new Woman();         Class c2      = anotherPerson.getClass();         System.out.println(c2.getName());      } }

class Human {        /**      * accessor      */     public int getHeight()     {        return this.height;     }

    /**      * mutator      */     public void growHeight(int h)     {         this.height = this.height + h;     } private int height; }

class Woman extends Human {     /**      * new method      */     public Human giveBirth()     {         System.out.println("Give birth");         return (new Human());     }

}

当我们调用对象的getClass()方法时,就得到对应Class对象的引用。

在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。

Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。无论我们对引用进行怎样的类型转换,对象本身所对应的Class对象都是同一个。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。

getClass: 我是谁?

除了getClass()方法外,我们还有其他方式调用Class类的对象。


public class Test

{

    public static void main(String[] args)

    {

        Class c3      = Class.forName("Human");

        System.out.println(c1.getName());

        Class c4      = Woman.class         System.out.println(c2.getName());      } }

上面显示了两种方式:

1.forName()方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。

2.Woman.class方法是直接调用类的class成员。这将返回相应的Class类对象。

Class类的方法

Class对象记录了相应类的信息,比如类的名字,类所在的包等等。我们可以调用相应的方法,比如:


getName()         返回类的名字

getPackage()      返回类所在的包

可以利用Class对象的newInstance()方法来创建相应类的对象,比如:


Human newPerson = c1.newInstance();  


newInstance()调用默认的不含参数的构建方法。

我们可以获得类定义的成员:


getFields()       返回所有的public数据成员

getMethods()      返回所有的public方法


可以进一步使用Reflection分析类。这里不再深入。

Class类更多的方法可查询官方文档:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html

Class类的加载

当Java创建某个类的对象,比如Human类对象时,Java会检查内存中是否有相应的Class对象。

如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。

在Class对象加载成功后,其他Human对象的创建和相关操作都将参照该Class对象。

 类似资料:
  • 本文向大家介绍举例讲解Java的RTTI运行时类型识别机制,包括了举例讲解Java的RTTI运行时类型识别机制的使用技巧和注意事项,需要的朋友参考一下 1、RTTI: 运行时类型信息可以让你在程序运行时发现和使用类型信息。 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射。下面就来说下RTTI。 RTTI:在运行时,识别一个对象的类型。但是这个类型在编译时必须已知。 下面通

  • 本文向大家介绍Java进阶教程之String类,包括了Java进阶教程之String类的使用技巧和注意事项,需要的朋友参考一下 之前的Java基础系列中讨论了Java最核心的概念,特别是面向对象的基础。在Java进阶中,我将对Java基础进行补充,并转向应用层面。 大部分编程语言都能够处理字符串(String)。字符串是有序的字符集合,比如"Hello World!"。在Java中,字符串被存储为

  • 运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。 多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。 Class类 Class类是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集

  • 本文向大家介绍python进阶教程之动态类型详解,包括了python进阶教程之动态类型详解的使用技巧和注意事项,需要的朋友参考一下 动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。 动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数

  • 本文向大家介绍Java进阶教程之IO基础,包括了Java进阶教程之IO基础的使用技巧和注意事项,需要的朋友参考一下 计算机最重要的功能是处理数据。一个有用的计算机语言需要拥有良好的IO功能,以便让未处理的数据流入程序,让已处理的数据流出。 与其他语言相比,Java的IO功能显得复杂。在其他语言中,许多IO功能(比如读取文件),是被封装好的,可以用一两行程序实现。在Java中,程序员往往需要多个层次

  • 本文向大家介绍Java进阶教程之异常处理,包括了Java进阶教程之异常处理的使用技巧和注意事项,需要的朋友参考一下 程序很难做到完美,不免有各种各样的异常。比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足。为了解决这些异常,我们需要知道异常发生的原因。对于一些常见的异常,我们还可以提供一定的应对预案。C语言中的异常处理是简单的通过函数返回值来实现的,但返回值代表的含义往往是由惯例决