java 运行时类型识别(RTTI) - 1 - Class与instanceof
java 运行时类型识别(RTTI) - 2 - 反射
三种方式:
1.传统类型转换
2.查询Class对象
3.instanceof
1.传统类型转换
String string = (String) s;
2.查询Class对象
首先需要了解一下java.lang.Class这个类
类型信息在运行时的表示是有Class这个类的实例完成的
java使用Class对象来执行其RTTI,即使是类似转型的这样的操作
每个类都有一个Class对象(被保存在一个同名的.class文件中),为了生成这个类的对象,运行这个程序的JVM将使用被称为"类加载器"的子系统
(有关类加载器的内容,稍后介绍)
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象
static{
//...
}
这些代码在类第一次加载时执行
下面看看think in java中的示例代码
public class Candy {
static {
System.out.println("Loading Candy");
}
}
public class Gum {
static {
System.out.println("Loading Gum");
}
}
public class SweetShop {
public static void main(String[] args) {
System.out.println("inside main");
new Candy();
System.out.println("After creating Candy");
try {
Class.forName("Gum");
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("After Class.forName(\"Gum\")");
}
}
运行结果
inside main
Loading Candy
After creating Candy
Loading Gum
After Class.forName("Gum")
Class仅在需要时加载,不然Loading Candy和Loading Gum应该在前面就输出了
这里要注意下Class.forName("Gum");
从log中看出,这句话也使得类Gum被加载了
生成Class引用可以用下面两种方式
1.newInstance()
newInstance使用的时候需要注意:
a.类需要有默认的构造器才可以,不然则会出现java.lang.InstantiationException
b.默认构造器必须能访问才行,不然会出现java.lang.IllegalAccessException
2.类字面常量
使用类字面量常量更简单,更安全:因为它在编译时被检查,所以也不需要try catch
并且使用类字面量不会初始化该Class
类字面量可以用于类、接口、数组、基本类型
对于基本数据类型的包装器类,有一个标准字段TYPE.TYPE是一个引用,指向对应的基本数据类型的Class
...等价于... |
boolean.class |
Boolean.TYPE |
char.class |
Character.TYPE |
byte.class |
Byte.TYPE |
short.class |
Short.TYPE |
int.class |
Integer.TYPE |
long.class |
Long.TYPE |
float.class |
Float.TYPE |
double.class |
Double.TYPE |
void.class |
Void.TYPE |
3.instanceof
我们可以使用关键字instanceof来做类型检查(x instanceof Gum),它返回一个boolean
我们也可以使用动态的boolean java.lang.Class.isInstance(Object obj)来做类型检查
instanceof与Class的等价性
public class Test {
static class Base{}
static class Derived extends Base{}
static void test(Object x){
System.out.println("Testing x of type " + x.getClass());
System.out.println("x instanceof Base " + (x instanceof Base));
System.out.println("x instanceof Derived " + (x instanceof Derived));
System.out.println("Base.isInstance(x) " + (Base.class.isInstance(x)));
System.out.println("Derived.isInstance(x) " + (Derived.class.isInstance(x)));
System.out.println("x.getClass() == Base.class " + (x.getClass() == Base.class));
System.out.println("x.getClass() == Derived.class " + (x.getClass() == Derived.class));
System.out.println("x.getClass().equals(Base.class) " + (x.getClass().equals(Base.class)));
System.out.println("x.getClass().equals(Derived.class) " + (x.getClass().equals(Derived.class)));
}
public static void main(String[] args) {
Test.test(new Base());
System.err.println("----------------------------");
Test.test(new Derived());
}
}
结果
Testing x of type class Test$Base
x instanceof Base true
x instanceof Derived false
Base.isInstance(x) true
Derived.isInstance(x) false
x.getClass() == Base.class true
x.getClass() == Derived.class false
x.getClass().equals(Base.class) true
x.getClass().equals(Derived.class) false
----------------------------
Testing x of type class Test$Derived
x instanceof Base true
x instanceof Derived true
Base.isInstance(x) true
Derived.isInstance(x) true
x.getClass() == Base.class false
x.getClass() == Derived.class true
x.getClass().equals(Base.class) false
x.getClass().equals(Derived.class) true
可以看出:instanceof与isInstance()结果一样,equals和==的结果一样
instanceof是类型检查,==是对象比较,不考虑继承等关系.
个人觉得比较好理解
类加载器
这里只贴出笔记,之后在总结虚拟机的时候再详细说明,会在这里给出链接
转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/
- 大小: 95.8 KB
- 大小: 100.6 KB
分享到:
相关推荐
在C++编程中,运行时类型识别(RTTI,Runtime Type Information)允许程序在运行时检查对象的确切类型。在MFC(Microsoft Foundation Classes)框架中,RTTI被用来增强面向对象编程的能力,特别是对于多态性和动态...
运行时类型信息(RTTI,Run-Time Type Information)是C++语言的一项特性,它允许程序在运行时查询和验证对象的精确类型。RTTI对于异常处理、多态性以及类型安全的转换至关重要。C++标准提供了两个主要的手段来利用...
在Java编程中,运行时类型识别(Runtime Type Identification,简称RTTI)是一种关键特性,它允许程序在运行时检查对象的实际类型。RTTI是Java多态性的重要基础,使得代码能够根据对象的实际类型执行不同的操作。...
强类型系统 RTTI(Run-Time Type Identification)是一种类型识别系统,主要用于在运行时期检查对象的实际派生类型。RTTI 提供了两个非常有用的操作符:typeid 操作符和 dynamic_cast 操作符。typeid 操作符返回指针...
在Delphi编程环境中,RTTI(Run-Time Type Information)是一种强大的特性,允许程序在运行时获取类型信息。...通过学习和使用这个示例,开发者可以提升他们的Delphi编程技能,尤其是对运行时类型信息的运用。
在Java中,RTTI允许我们在程序运行时检查和操作对象的实际类型,这是通过使用`instanceof`关键字和`getClass()`方法实现的。在泛型类中,虽然类型参数在编译时被擦除,但仍然可以通过一些方式获取类型信息。 泛型类...
运行时类型识别(RTTI,Runtime Type Information)是C++编程语言中的一种特性,允许程序在运行时查询对象的确切类型。RTTI提供了一种机制,使得代码可以在运行时检查对象的实际类型,这对于多态性编程和动态类型...
Java的RTTI(Runtime Type Information,运行时类型信息)机制是Java语言的一个重要特性,它允许程序在运行时检查对象的实际类型。RTTI使得在编译时未知类型的对象能够在运行时进行适当的处理,从而增强了代码的灵活...
运行时类型识别(RTTI,Runtime Type Information)是C++编程语言中的一种特性,允许程序在运行时查询对象的实际类型信息。RTTI 提供了一种方法来检查对象的动态类型,这对于多态性编程和处理类层次结构尤其有用。...
**rtti-obfuscator** 是一个专为C++编译器生成的二进制文件设计的工具,其主要目的是混淆其中的 **RTTI (Runtime Type Information)**,以增强程序的安全性和难以逆向工程的特性。在本文中,我们将深入探讨RTTI、其...
介绍 RTTI 的基本概念、类和 VMT 的关系、类、类的类、类变量的关系、TObject.ClassType 和 TObject.ClassInfo、is 和 as 运算符的原理、TTypeInfo – RTTI 信息的结构、获取类的属性信息、获取方法的类型信息、获取...
运行时类型识别(RTTI,Run-time type identification)是C++中的一种特性,它允许程序在运行时检查对象的确切类型。RTTI主要用于处理多态性,即在基类指针或引用下处理不同派生类对象的情况。在C++这种静态类型语言...
从给定文件的【部分内容】中我们可以了解到,该文档主要讲述了Java中运行时类型识别(RTTI)的原理和用途,以及Java中的反射机制。在此基础上,我们进一步探讨Java中RTTI和反射的相关知识点。 知识点一:运行时类型...
C++的运行时类型信息(Runtime Type Information,简称RTTI)是一种强大的特性,它允许在程序运行时查询对象的实际类型。在深入探讨RTTI的实现机制之前,我们首先理解RTTI的基本概念。在C++中,类型识别分为静态识别...
Java 中的运行时类型识别(RTTI)机制是指在程序执行过程中,Java 虚拟机(JVM)可以识别出对象的真正类型信息,而不仅仅是引用类型。这项机制是通过 Class 类实现的。 Class 类是 Java 中的核心类之一,包含了关于...
RTTI是Run-time Type Identification的缩写,即运行时类型识别。Java语言通过RTTI可以在运行时知道一个对象的类型信息。RTTI在Java中主要通过两种形式存在:一种是传统的类型转换,也就是instanceof关键字和类的...
运行时类型识别(Runtime Type Information,简称RTTI)是C++语言中的一种特性,它允许在程序运行期间获取对象的实际类型信息。RTTI是C++为面向对象编程提供的一项强大工具,尤其在多态性编程中,能够帮助我们实现更...
1. JAVA 使用 Class 对象来执行 RTTI(RunTime Type Information),创建这个类的实例。 2. 验证同一个类的多个对象的Class对象是一个。 获取 Class 对象有多种方式: 1. 通过 Class 的 forName(String name) 方法...
RTTI,全称Runtime Type Information(运行时类型信息),是编程语言中的一种特性,允许程序在运行时获取对象的类型信息。在Delphi中,RTTI是一个强大的工具,它使得开发者能够在运行时检查、操作类的属性、方法和...