一、Java的RTTI 

RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类都对应一个Class对象(在编写并且编译后),这个对象被保存在这个类的同名class文件里。

类加载器在类被第一次静态调用(比如一个静态方法,一个静态代码块或者new关键字调用构造器,注意contructors其实都是静态的)时会把那个对应的Class对象加载到内存中。

Class类有名的一个static方法是forName。Class.forName("classname with packagepath");通过这个静态方法返回的一个对类的Class对象的引用,用户可以在运行时动态得到大量关于这个类的信息,包括接口,父类,方法,静态成员,甚至是像newInstance()方法这样的一个实现“虚拟构造器”的一种方式。所谓的虚拟构造器,就是声明“我不知道你的确切类型,至少在编译期不知道,但是我就是要正确的创建你的一个对象”。

比如说c是某个类的Class对象
Class superc = c.getSuperClass();
Object obj = null;
obj = c.newInstance();
毫无疑问,这个obj实际指向的对象是c的父类的一个对象。
鉴于java的单继承模式,这个父类显然是唯一确定的,尽管在编译时我完全不知道它的类名。

Java提供的另外一种更加安全的得到Class类的对象的方式是,使用类字面常量。
classname.class;

Java在RTTI中的第三种形式是最常见的。就是instanceof关键字,用法就不多说了。该关键字的调用其实就是使用了Class对象,并且返回一个布尔值。如果说instanceof和Class的比较唯一的不同,那就是instanceof如果是其子类的对象也会返回true,而Class对象比较的会是确切的那个类型。

这样得到类的Class对象可以在编译器就得到检查。

RTTI的限制?显然它在编译时必须知道一个非常重要的东西:类名(甚至是全类名)

二、Java的反射

Java中有时候在编译器为程序生成代码很久之后才会出现要处理的那个类,那么这个时候怎么才能处理这个类呢,即在编译的时候根本无法获知这个对象所属的类。答案就是利用Java的反射机制。Java的反射与RTTI的区别就在于编译时不需要知道任何事情,匿名对象的信息在运行时确定下来就可以。

例如:

  1. public class ShowMethods {
  2. private static String usage=
  3. "usage"+
  4. "showMethods qualified.class.name\n"+
  5. "To show all methods in class or:\n"+
  6. "showMethods qualified.class.name word\n"+
  7. "To search for methods involving 'word'";
  8. private static Pattern p=Pattern.compile("\\w+\\.");
  9. /**
  10. * @param args
  11. */
  12. public static void main(String[] args) {
  13. // TODO Auto-generated method stub
  14. if(args.length<1){
  15. System.out.println(usage);
  16. System.exit(0);
  17. }
  18. int lines=0;
  19. try{
  20. Class<?> c=Class.forName(args[0]);
  21. Method[] methods=c.getMethods();
  22. Constructor[] ctors=c.getConstructors();
  23. if(args.length==1){
  24. for(Method method:methods)
  25. System.out.println(p.matcher(method.toString()));
  26. for(Constructor cotr:ctors)
  27. System.out.println(p.matcher(cotr.toString()));
  28. lines=methods.length+ctors.length;
  29. }else{
  30. for(Method method:methods)
  31. if(method.toString().indexOf(args[1])!=-1){
  32. System.out.println(method.toString());
  33. lines++;
  34. }
  35. }
  36. for(Constructor ctor:ctors)
  37. if(ctor.toString().indexOf(args[1])!=-1){
  38. System.out.println(p.matcher(ctor.toString()).replaceAll(""));
  39. lines++;
  40. }
  41. }catch(ClassNotFoundException e){
  42. System.out.println("No such class"+e);
  43. }
  44. }

在这个类编译时:javac ShowMethods.java  

//这个时候完全不知道

  1. Class<?> c=Class.forName(args[0]);

中的args[0]的内容是什么。

运行时:java ShowMethods ShowMethods

此时第二个ShowMethods为参数传递进去,即运行时才获得了类型信息。这便是反射。

Java RTTI和反射的更多相关文章

  1. Java系列笔记(2) - Java RTTI和反射机制

    目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这 ...

  2. 浅析Java RTTI 和 反射的概念

    一.概念: RTTI(Run-Time Type Identification,运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,怎么理解这个Class对象呢?如果说类 ...

  3. RTTI和反射

    JAVA 运行时识别对象和类的信息,主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型:另一种是"反射"机制,它允许我们在运行时发现和使用类的信息. 参考 ...

  4. Java RTTI and Reflection

    Reference: Java编程思想 java 反射(Reflect) Java系列笔记(2) - Java RTTI和反射机制 Java Reflection in Action, 有空再补 -- ...

  5. 【Java基础】RTTI与反射之Java

    一.引言 很多时候我们的程序可能需要在运行时识别对象和类的信息,比如多态就是基于运行时环境进行动态判断实际引用的对象.在运行时识别对象和类的信息主要有两种方式:1.RTTI,具体是Class对象,它假 ...

  6. Java RTTI机制与反射机制

    1.1 什么是RTTI? 维基百科的定义:In computer programming, RTTI (Run-Time Type Information, or Run-Time Type Iden ...

  7. java之RTTI和反射的理解

    最近在读 Thinking in Java 这本书.读到类型信息这一张时,刚开始对书中所说的RTTI和反射彻底混了,不知道有什么联系,有哪些相同点和区别.于是在网上又找了些内容辅助理解,这一章又重新读 ...

  8. Java类型信息(RTTI和反射)

    要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...

  9. Java学习笔记--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法.字段.构造函数等,并能够通过反射调用类或者类对象的方法.在Java中,java.lang.Class类与ja ...

随机推荐

  1. angular.js 简单的表达式

    <!doctype html> <html> <head> <meta charset ="utf-8"> <script s ...

  2. java中的继承要点

    java的一大特性既是:继承. 1.因为有了一个子类继承了一个父类,才有了后面的多态. 2.类的继承,不要为了节省代码,为了继承而继承,把那个没有任何相关的类链接在一起,继承必须用在 is a,就是例 ...

  3. SGU 150.Mr. Beetle II

    非常烦人的题,思路比较简单,十分容易出错,细节非常重要. 从四个不同的行走方向讨论经过的每一个格子. code: #include <iostream> #include <util ...

  4. OC文件操作(2)

    NSFileManager 文件管理器完成文件的创建.移动.拷贝等管理操作 1.查询文件和目录  OC中查询路径下的目录主要分为浅度遍历和深度遍历.  浅度遍历  NSFileManager * ma ...

  5. dedecms 文章内容文章名字和文章网址的调用

    文章标题: <a href="{dede:field name='arcurl'/}">{dede:field.title/}</a> 本文章网址: < ...

  6. php生成缩略图

    <?php /** * 生成缩略图函数(支持图片格式:gif.jpeg.png和bmp) * @author ruxing.li * @param string $src 源图片路径 * @pa ...

  7. 关于DEDECMS目录移动方法

    最近在做一个美容医院的站,由于我的本地的PHP服务器上有几个站,又不能放在根目录下,只能在根目录下新建一个目录来存放这个站,于是就有了这篇文章. 如果我们直接将根目录下的A文件夹下的DEDECMS文件 ...

  8. test知识

    内部测试SIT ——system integration testcase 用户测试UAT——user acceptance test SIT是集成测试UAT是验收测试从时间上看,UAT要在SIT后面 ...

  9. 3ds max 2016 新功能

    3ds max 2016 新功能_MCG节点编辑器 这是介绍视频下载: http://pan.baidu.com/s/1gds4wqJ

  10. 【转】分享II→IV FPGA本人的几个版本电源模块设计的方案

    很多人问我FPGA的电源怎么怎么着,当然也有人瞎忽悠乱设计,当然我的设计也不是很完美...这里把我当年第一次设计FPGA,到现在的电源方案,几个演变.分析的过程,给大家讲讲... (1)FPGA电源方 ...