Java进阶---RTTI

PGGuang 8年前
   <p>运行时类型识别( RTTI , Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息。</p>    <p>多态(polymorphism)是基于RTTI实现的。RTTI的功能主要是由Class类实现的。</p>    <h3>Class类</h3>    <p>Class类 是"类的类"(class of classes)。如果说类是对象的抽象和集合的话,那么Class类就是对类的抽象和集合。</p>    <p>每一个Class类的对象代表一个其他的类。比如下面的程序中,Class类的对象c1代表了Human类,c2代表了Woman类。</p>    <pre>  <code class="language-java">  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());      }    }    </code></pre>    <p>当我们调用对象的 getClass() 方法时,就得到对应Class对象的引用。</p>    <p>在c2中,即使我们将Women对象的引用向上转换为Human对象的引用,对象所指向的Class类对象依然是Woman。</p>    <p>Java中每个对象都有相应的Class类对象,因此,我们随时能通过Class对象知道某个对象“真正”所属的类。 无论我们对引用进行怎样的类型转换, 对象本身所对应的Class对象都是同一个 。当我们通过某个引用调用方法时,Java总能找到正确的Class类中所定义的方法,并执行该Class类中的代码。由于Class对象的存在,Java不会因为类型的向上转换而迷失。这就是多态的原理。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1a5c173cc0a9d38467b98e6dfaa3c8f1.jpg"></p>    <p>getClass: 我是谁?</p>    <p>除了getClass()方法外,我们还有其他方式调用Class类的对象。</p>    <pre>  <code class="language-java">  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());        }  }    </code></pre>    <p>上面显示了两种方式:</p>    <ul>     <li>forName() 方法接收一个字符串作为参数,该字符串是类的名字。这将返回相应的Class类对象。</li>     <li>Woman. class 方法是直接调用类的class成员。这将返回相应的Class类对象。</li>    </ul>    <h3>Class类的方法</h3>    <p>Class对象记录了相应类的信息,比如类的名字,类所在的包等等。我们可以调用相应的方法,比如:</p>    <p>getName()     返回类的名字</p>    <p>getPackage()   返回类所在的包</p>    <p>可以利用Class对象的 newInstance() 方法来创建相应类的对象,比如:</p>    <pre>  <code class="language-java">Human newPerson = c1.newInstance();    </code></pre>    <p>newInstance()调用默认的不含参数的构建方法 。</p>    <p>我们可以获得类定义的成员:</p>    <p>getFields()  返回所有的public数据成员</p>    <p>getMethods()  返回所有的public方法</p>    <p>可以进一步使用Reflection分析类。这里不再深入。</p>    <h3>Class类的加载</h3>    <p>当Java创建某个类的对象,比如Human类对象时,Java会检查内存中是否有相应的Class对象。</p>    <p>如果内存中没有相应的Class对象,那么Java会在.class文件中寻找Human类的定义,并加载Human类的Class对象。</p>    <p>在Class对象加载成功后,其他Human对象的创建和相关操作都将参照该Class对象。</p>    <p>学习Java的同学注意了!!!<br> 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码: 286945438 我们一起学Java!</p>    <p> </p>    <p>来自:http://blog.csdn.net/qq_35101189/article/details/53781335</p>    <p> </p>