`

类型检查(RTTI与反射机制)转载

 
阅读更多


                                        类型检查(RTTI与反射机制)


1、类型时类型识别(run-timetype identification,RTTI):当之有一个指向对象的引用时,RTTI可以让你找出这个对象的确切类型。
2、Java运行时识别对象和类的信息,主要有俩种方式:

1).一种是“传统“RTTI,它假定我们在运行时已经知道了所有的类型。

2).另一种是“放射“机制,它允许我们在运行时获得类的信息。

3、Class对象:每个类都有一个Class对象,保存在一个同名的.class文件中,它包含了与类相关的信息。

4、在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载,就会根据类名查找.class文件,并将其载入。所以Java并非一开始执行就完全加载的,这一点与许多传统语言都不同。        

5、Class.forName(“类名”)是获得Class引用的一种方法,该方法返回一个Class对象的引用。例如:Class.forName(“MyClass”);

在调用该方法时,若MyClass类被还没加载,则加载MyClass类。

6、类字面常量:另一种获得Class引用的方法,MyClass.class(类名.class)。

此方法,更安全,更高效。

7、类字面常量不仅应用于普通的类,也可以应用于接口、数组以及基本数据类型。

8、RTTI的形式包括:

1).传统的类型转化。如Base类是Subclass类基类。

  1. Base base = new Subclass();  
  2. Subclass sub= (Subclass)base;//(Subclass),由RTTI确定类型转化正确性。在C++中,经典的类型转换“(Subclass)”并不使用RTTI。  

 

2).代表对象的类型的Class对象。同过查询Class对象可以获取运行时所需的信息。

3).RTTI的第三种形式,使用关键字“instanceof”。如:

  1. boolean yesOrNot = (base instanceof Subclass);  

 

若base是Subclass类的实例,yesOrNot就为true

9、instanceof与Class的等价性:

  1. class Base{}  
  2. class Subclass extends Base{};  
  3. public class Test{  
  4.    static void test(Object x){  
  5.       System.out.println("Testing x of type: " + x.getClass());  
  6.       System.out.println("x instanceof Base: " + (x instanceof Base));  
  7.       System.out.println("x instanceof Subclass: " + (x instanceof Subclass));  
  8.       System.out.println("Base.isInstance(x): " + (Base.class.isInstance(x)));  
  9.       System.out.println("Subclass.isInstance(x):" + (Subclass.class.isInstance(x)));  
  10.       System.out.println("x.getClass() == Base.class: " + (x.getClass() == Base.class));  
  11.       System.out.println("x.getClass() == Subclass.class: " + (x.getClass() == Subclass.class));  
  12.       System.out.println("x.getClass().equals(Base.class): " + (x.getClass().equals(Base.class)));  
  13.       System.out.println("x.getClass().equals(Subclass.class): " + (x.getClass().equals(Subclass.class)));  
  14.    }  
  15.    public static void main(String[] args){  
  16.       test(new Base());  
  17.    System.out.println("---------------------------------------------------");  
  18.       test(new Subclass());  
  19.    }  
  20. }  

 

运行结果:

1).instanceof 与 isInstance生成的结果完全一样,equal与==也一样。

2). Instanceof与isInstance保持了类型的概念,它指得是“你是这个类,或者是这个类的派生类吗?”

3).equal与==比较实际的Class对象,没有考虑继承。

10、Java是通过Class对象来实现RTTI机制的,即使我们只是做些诸如类型转换这类的事情。Class类提供的一些方法:

11、RTTI的限制:编译器必须已经知道所有用RTTI来处理的类型。但是,当你从网络连接中获得一串字节,并被告知这些字节代表一个类。可是编译器并不知道这个类的信息。这时你要使用这个类,那么就得使用反射机制

12、RTTI与反射之间的区别:对RTTI来书,编译器在编译时打开和检查.class文件,而对于反射机制,.class文件在编译时是不可获取的,所以是在运行时打开和检查.class文件的。

13、获取关于类和对象的反射信息在java.lang.reflect库中,它包含了Field、Method以及Constructor类。

1).Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

2). Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

3). Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。 

Base类如下:

  1. class Base{  
  2.     private int number = 1;  
  3.     public int otherNum = 100;  
  4.     public Base(){  
  5.           
  6.     }  
  7.     public Base(int number){  
  8.         this.number = number;  
  9.     }  
  10.     public void func(){  
  11.         number++;  
  12.     }  
  13.     public void otherFunc(){  
  14.         otherNum--;  
  15.     }  
  16. }  
Test:
  1. public class Test{  
  2.     public static void main(String[] args){  
  3.         Constructor[] constructors = null;  
  4.         Method[] methods = null;  
  5.         Field[] fields = null;  
  6.         try {  
  7.             Class c = Class.forName("Base");  
  8.             constructors = c.getConstructors();//公有构造方法。  
  9.             methods = c.getMethods();//公有方法。  
  10.             fields = c.getFields();//公有字段。  
  11.         } catch (ClassNotFoundException e) {  
  12.             e.printStackTrace();  
  13.         } catch (SecurityException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.         System.out.println("Base含有的公有构造方法:");  
  17.         for(int i = 0; i < constructors.length; i++){  
  18.             System.out.println(constructors[i].getName());  
  19.         }  
  20.         System.out.println("Base含有的公有方法(有些是从Oject继承的):");  
  21.         for(int i = 0; i < methods.length; i++){  
  22.             System.out.println(methods[i].getName());     
  23.         }  
  24.         System.out.println("Base含有的公有字段:");  
  25.         for(int i = 0; i < fields.length; i++){  
  26.             System.out.println(fields[i].getName());          
  27.         }  
  28.     }  
  29. }  
运行结果:

 

分享到:
评论

相关推荐

    运行时类型信息RTTI及类型转换

    其中,`dynamic_cast`是与RTTI紧密相关的转换,它用于从基类指针或引用安全地转换为派生类类型。`dynamic_cast`在运行时进行检查,只有当转换是安全的,即实际对象确实是可以转换的派生类类型,转换才会成功。如果...

    Java的RTTI和反射机制代码分析

    Java的RTTI(运行时类型识别)和反射机制是两种强大的工具,它们允许程序在运行时检查和操作类的信息及对象。RTTI是Java的一种特性,它使得在编译后的程序中仍然可以在运行时获取对象的实际类型信息。这在处理多态性...

    强类型系统 RTTI 类型识别

    强类型系统 RTTI(Run-Time Type Identification)是一种类型识别系统,主要用于在运行时期检查对象的实际派生类型。RTTI 提供了两个非常有用的操作符:typeid 操作符和 dynamic_cast 操作符。typeid 操作符返回指针...

    Delphi的RTTI机制文档

    - 动态调用未知方法:通过TRttiMethod.Invoke实现,特别适用于插件或反射机制。 5. **限制与注意事项** - 性能影响:RTTI增加了代码的运行开销,应谨慎在性能敏感的代码中使用。 - 不支持非公开成员:默认情况下...

    个人收集的RTTI机制

    1. 检查类型:`typeid`可以用来检查一个变量或表达式的实际类型,这在处理多态对象或需要运行时类型信息时非常有用。 2. 异常处理:当`dynamic_cast`失败时,`typeid`可以用于捕获`std::bad_cast`异常,提供更精确...

    MFC运行时类型识别(MFC RTTI)与动态创建.doc

    总之,MFC的RTTI机制结合了`CObject`类和`CRuntimeClass`结构,为程序员提供了强大的运行时类型检查和动态创建对象的能力。正确理解和使用这些特性可以极大地增强MFC应用程序的灵活性和可扩展性。

    Delphi-的RTTI机制浅探.doc

    Delphi 的 RTTI 机制浅探 RTTI(Run-Time Type Information)是 Delphi 中的一种机制,可以在运行...Delphi 的 RTTI 机制可以在运行期获取数据类型或类的信息,可以用于各种场景,例如、反射、序列化、日志记录等等。

    在运行时确定对象类型(RTTI)

    RTTI 提供了一种方法来检查对象的动态类型,这对于多态性编程和处理类层次结构尤其有用。虽然一些面向对象的设计者建议优先使用虚拟成员函数来实现多态行为,但在某些场景下,如处理异类容器或需要对对象进行特定...

    Delphi_的RTTI机制浅探.doc

    综上所述,Delphi 的 RTTI 机制提供了强大的类型信息访问能力,使得开发者在运行时能够获取和操作对象的详细类型信息,这对于动态编程、反射以及代码生成等高级应用具有重要意义。通过 RTTI,程序员可以编写出更加...

    Java 基础(7-8) - 反射机制详解.pdf

    RTTI(Run-Time Type Identification)机制是 Java 反射机制的一部分。它允许我们在运⾏时发现和使⽤类的信息。RTTI 机制有两种形式,一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型;另一种是...

    RTTI.rar_ RTTI_rtti

    - **反射机制**: 虽然C++标准库没有内置反射,但可以通过RTTI实现一定程度的自省能力。 5. **www.pudn.com.txt文件可能包含的内容** 这个文本文件可能包含了关于RTTI的教程链接、示例代码解释或者是相关资源的...

    RTTI.zip_DELPHI RTTI_delphi_rtti

    在Delphi中,RTTI可以帮助我们进行动态类型检查、反射操作以及自动生成代码等高级编程任务。本资料“RTTI.zip_DELPHI RTTI_delphi_rtti”包含了关于如何在Delphi中利用RTTI的实例和演示。 1. **RTTI基础知识** - ...

    深入理解Java的反射机制Java系列2021.pdf

    Java的反射机制是Java语言提供的一种能力,它允许程序在运行期动态地访问和修改类的属性和方法。对于理解Java反射机制,需要掌握以下核心知识点: 1. 反射机制基础: Java程序在编译期和运行期有不同的处理过程。...

    C++实现反射机制

    在编程领域,反射机制是一种强大的特性,它允许程序在运行时检查自身的行为和结构,包括类、对象、方法等信息。通常,动态语言如Java和Python内置了反射机制,但C++作为静态类型语言,其标准库并没有提供直接的支持...

    C++反射机制

    然而,通过巧妙地利用模板元编程和类型信息,可以模拟出一定程度的反射机制。 标题中的"C++反射机制"指的就是一种在C++中实现的类似动态类型语言中反射功能的技术。描述提到的是一个简单的实现方案,即通过继承某个...

    RTTI.rar_RTTI info_Run Time_rtti

    然而,在某些复杂或特定的场景下,如插件系统、反射机制或复杂的对象模型,RTTI是不可或缺的。 总的来说,RTTI是C++提供的一种强大的工具,允许程序员在运行时获取对象的类型信息,进行动态类型转换和类型检查。...

Global site tag (gtag.js) - Google Analytics