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是类型检查,==是对象比较,不考虑继承等关系.
个人觉得比较好理解
类加载器
这里只贴出笔记,之后在总结虚拟机的时候再详细说明,会在这里给出链接
分享到:
相关推荐
MFC运行时类型识别(MFC RTTI)与动态创建.doc
C运行时类型信息RTTI及类型转换的简单介绍
主要介绍了Java进阶教程之运行时类型识别RTTI机制,在Java运行时,RTTI维护类的相关信息,比如多态(polymorphism)就是基于RTTI实现的,需要的朋友可以参考下
运行时类型识别(RTTI)原理.当你看到一种颜色,想知道它的RGB成分比,不查色表行吗?当你持有一种产品,想知道它的型号,不查型录行吗?要达到RTTI的能力,我们一定要在类构建起来的时候,记录必要的信息,已建立型...
主要介绍了Java的RTTI运行时类型识别机制,包括泛化的Class引用以及类型检查instanceof等知识点,需要的朋友可以参考下
强类型系统RTTI,类型识别系统,对于像了解这个概念的同仁们,是不错的选择!
通过delphi的RTTI机制建立类的方法建立rttiinspector属性编辑框,从而自己随心使用
rtti-obfuscator:混淆二进制文件中的所有RTTI(运行时类型信息)
一些面向对象专家在传播自己的设计理念时,大多都主张在设计和开发中明智地使用虚拟成员函数,而不用 RTTI 机制。但是,在很多情况下,虚拟函数无法克服本身的局限。
RTTI(RuntimeTypeIdentification,运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。MFC早在编译器支持RTTI之前,就具有了这项能力。承接上一章,我们现在要在Console...
c++ RTTI深度解析, 运行时类型识别技术
涵盖的对象通过两个视图包括包,模块,函数,方法,脚本和类:-文件系统视图-包,模块和行号-基于文件和路径-运行时对象视图-可调用项,类和容器-基于内存RTTI上/自省支持的平台包括:-Linux,BSD,Unix,OS-X,...
例如:RTTI类型识别的实质就是strcmp前面说的buf(type_info中的_m_d_name)是不是和Base的_m_d_name相等C++采用静态识别
在C++中如果使用多态继承类,对于多态性的对象,在程序编译时可能会出现无法确定对象的类型的情况,这事就需要通过RTTI动态识别对象的类型。因此,本文探讨了RTTI的使用细节。同时,由于有些平台C++编译器(如...
运行时类型识别演示
本篇主要是深入对Java中的Class对象进行分析,这对后续深入理解反射技术非常重要,主要内容如下:认识Class对象之前,先来了解一个概念,RTTI(Run-TimeTypeIdentification)运行时类型识别,对于这个词一直是C++中...
Ghidra C++ 类和运行时类型信息分析器 API 文档 完整构建和链接的文档版本可在。 建造 在您选择的终端中运行以下命令。 gradle buildExtension 完成后,输出将位于 dist 文件夹中。 安装 将存档解压缩到您选择的...
Compiler Internals: Exceptions and RTTI Igor Skochinsky Hex-RaysRecon 2012 Montreal2(c) 2012 Igor SkochinskyOutlineOutlineVisual C++ Structured Exception Handling (SEH) C++ Exception Handling (EH)GCC ...