zoukankan      html  css  js  c++  java
  • Java进阶04 RTTI

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

    运行时类型识别(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());  
        }
    }

    上面显示了两种方式:

    • forName()方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。
    • 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快速教程”系列文章

     

  • 相关阅读:
    Ubuntu 14.04 卸载通过源码安装的库
    Ubuntu 14.04 indigo 相关依赖
    Ubuntu 14.04 indigo 安装 cartographer 1.0.0
    Ubuntu 14.04 改变文件或者文件夹的拥有者
    安装cartographer遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"问题
    Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法
    查看所有用户组,用户名
    1卸载ROS
    Ubuntu14.04 软件安装卸载
    Ubuntu14.04系统显示器不自动休眠修改
  • 原文地址:https://www.cnblogs.com/vamei/p/3013985.html
Copyright © 2011-2022 走看看