`

java Class 及 RTTI 相关

阅读更多
运行时类型信息(RunTime Type Information,RTTI)使得你在程序运行时发现和使用类型
信息。RTTI主要用来运行时获取向上转型之后的对象到底是什么具体的类型。
1.Class对象:
JAVA使用Class对象来执行RTTI。每个类都有一个Class对象,它用来创建这个类的所有
对象,反过来说,每个类的所有对象都会关联同一个Class对象(对于数组来说,维数、类
型一致的数组的Class 对象才是相同的),每个对象的创建都依赖于Class对象的是否创建,
Class对象的创建发生在类加载(java.lang.ClassLoader)的时候。
java.lang.Class类实现了Serializable、GenericDeclaration、Type、AnnotatedElement四个接口,
分别实现了可序列化、泛型定义、类型、元数据(注解)的功能。
你可以把Class对象理解为一个类在内存中的接口代理(它代理了这个类的类型信息、方法
签名、属性),JVM加载一个类的时候首先创建Class对象,然后创建这个类的每个实例的
时候都使用这个Class 对象。
Class只有一个私有的无参构造方法,也就是说Class的对象创建只有JVM可以完成。
如何验证同一个类的多个对象的Class对象是一个呢?
Cf1 cf1 = new Cf1();
Class clazz = Cf1.class;
System.out.println(cf1.getClass() == clazz);
我们知道==用来比较引用是否相等(也就是同一个引用),上面的输出语句结果是true。那
么Class对象是否相等是JAVA对象中唯一可以使用==判断的。
如何获取Class对象:
1.所有的引用数据类型(类-类型)的类名、基本数据类型都可以通过.class方式获取其Class
对象(对于基本数据类型的封装类还可以通过.TYPE 的方式获取其Class 对象,但要注
意.TYPE 实际上获取的封装类对应的基本类型的Class 对象的引用,那么你可以判断出
int.class==Integer.TYPE 返回true,int.class==Integer.class 返回false!),通过这种方式
不会初始化静态域,使用.class、.TYPE 的方式获取Class对象叫做类的字面常量;
2.Class 的forName(String name)传入一个类的完整类路径也可以获得Class 对象,但由于使
用的是字符串,必须强制转换才可以获取泛型的Class<T>的Class对象,并且你必须获取这
个方法可能抛出的ClassNotFoundException异常。
2.对于引用数据类的引用(必须初始化),可以通过Object 类继承的getClass()方法获取这
个引用的Class对象,由于引用已经被初始化,所以这种方式也不会初始化静态域,因为静
态域已经被初始化过。另外,前面两种方式如果说是创建Class对象,那么这种方式应该是
取得Class对象,因为类的实例已经被创建,那么Class对象也一定早就被创建。
Class的常用方法:
l forName(String name):这是一个静态方法,传入的参数是一个类的完整类路径的
字符串,返回这个类的Class 对象,前面说过Class 对象的创建发生在类的加载时,所
以这个方法会导致静态成员被调用;
l forName(String name,boolean initialize,ClassLoader loader):这是上面的方
法的重载方法,initialize指定在创建Class对象时是否初始化这个类(即是否执行静态成
员,由于在一次JVM的执行中,静态成员的初始化只类加载的时候执行一次,所以如果
之前这个类已经被加载,那么即使initialize为true也不会再次执行静态成员的加载),
loader指定使用哪个类加载器的实现类
(Thread.currentThread().getContextClassLoader()可以获取当前线程使用的类
加载器)。forName(***)方法不可以获取基本数据类型的Class对象。
如果要测试initialize是否起作用,请不要在main()方法测试自身类,因为main()是静态方法,
执行这个方法会导致静态域被初始化,所以你的initialize无论是true还是false,效果都是一样
的。
l asSubClass(Class superClass):这个方法是将父类的class 对象作为参数传入,并
将其强制转换成当前的Class对象(子类的Class对象)。
例:
Class<List> clazz = List.class;
Class<? extends List> subClazz = ArrayList.class.asSubclass(clazz);
System.out.println(subClazz.getCanonicalName());
注意红色的部分不能写成Class<ArrayList>形式,因为asSubclass()只知道是要转换成子
类的Class对象,但不知道是哪个子类。
l cast(Object o):这个方法是将传入的对象强制转换成Class 对象所代表的类型的对
象;
分享到:
评论

相关推荐

    java元数据——CLass类

    1. JAVA 使用 Class 对象来执行 RTTI(RunTime Type Information),创建这个类的实例。 2. 验证同一个类的多个对象的Class对象是一个。 获取 Class 对象有多种方式: 1. 通过 Class 的 forName(String name) 方法...

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

    RTTI的核心在于Java的`Class`类,它提供了获取对象运行时类型信息的能力。每种Java类在运行时都有一个与之关联的`Class`对象,这个对象包含了类的所有元数据,如类名、包名、接口、方法等。通过`Class`对象,我们...

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

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

    举例讲解Java的RTTI运行时类型识别机制

    在Java中,RTTI主要有两种表现形式:`instanceof`关键字和`Class`对象。 1. `instanceof`关键字:`instanceof`用于判断一个对象是否属于某个类或其子类(或者实现了某个接口)。例如,在上述代码中,我们可以通过`...

    java 泛型类的类型识别示例

    在Java中,RTTI允许我们在程序运行时检查和操作对象的实际类型,这是通过使用`instanceof`关键字和`getClass()`方法实现的。在泛型类中,虽然类型参数在编译时被擦除,但仍然可以通过一些方式获取类型信息。 泛型类...

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

    RTTI的实现依赖于Java类模型中的Class类,它是所有类的最终父类,每个类在运行时都会有一个对应的Class对象。 3. Class类与RTTI的关系: Class类是Java中一个非常重要的类,它用于表示Java运行时的类型信息。Class...

    Java反射之Constructor、Method、Field使用及说明

    在深入探讨Java反射机制中`Constructor`、`Method`、`Field`以及`Class`类的使用之前,我们需要先了解反射的基本概念及其重要性。反射是Java的一项强大功能,它允许程序在运行时检查类和对象的结构,甚至可以创建和...

    JAVA反射机制中getClass和class对比分析

    Class对象是用来创建所有“常规”对象的,Java使用Class对象来执行RTTI,即使你正在执行的是类似类型转换这样的操作。 每个类都会产生一个对应的Class对象,也就是保存在.class文件。所有类都是在对其第一次使用时...

    Thinking_in_java(chapter10).pdf

    在此基础上,我们进一步探讨Java中RTTI和反射的相关知识点。 知识点一:运行时类型识别(RTTI) 1. 概念:RTTI是“Run-Time Type Identification”的缩写,意为运行时类型识别,允许在运行时确定对象的类型。 2. ...

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

    每个 Java 类运⾏时都在 JVM ⾥表现为⼀个 Class 对象,可以通过类名.class、类型.getClass()、Class.forName("类名") 等方法获取 Class 对象。 二、Class 类 Class 类是 Java 反射机制的核心。它提供了多种方法来...

    Practical Java(简体中文)

    Java的动态类型系统和RTTI(Run-Time Type Information)、Reflection机制,提供了对运行时类型的深入洞察,增强了程序的灵活性和动态性。此外,Java的**标准程序库**(Java Libraries)是其另一大亮点,涵盖了广泛...

    JAVA反射机制

    Java使用Class对象来执行RTTI。每个类都有一个Class对象,类加载器(ClassLoader)在类首次被加载到JVM时创建这个对象。通过Class对象,可以获取关于类的详细信息,比如构造函数、成员变量、方法等。 在Java中,...

    java联想(中文)

    11.1.1 Class对象 11.1.2 造型前的检查 11.2 RTTI语法 11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按...

    Practicla Java.pdf(简体中文版)

    - **出版情况**:该中文版由台湾碁峰图书公司及中国电力出版社联合出版。 - **内容概述**:本书旨在为Java开发者提供深入浅出的技术指导,聚焦于Java语言本身及其编程技巧。 #### 二、面向对象编程与Java - **面向...

    Thinking in Java 中文第四版+习题答案

    11.1.1 Class对象 11.1.2 造型前的检查 11.2 RTTI语法 11.3 反射:运行期类信息 11.3.1 一个类方法提取器 11.4 总结 11.5 练习 第12章 传递和返回对象 12.1 传递句柄 12.1.1 别名问题 12.2 制作本地副本 12.2.1 按值...

Global site tag (gtag.js) - Google Analytics