`
su1216
  • 浏览: 670469 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:71876
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:128681
社区版块
存档分类
最新评论

java 运行时类型识别(RTTI) - 1 - Class与instanceof

    博客分类:
  • java
阅读更多

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
分享到:
评论

相关推荐

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

    在C++编程中,运行时类型识别(RTTI,Runtime Type Information)允许程序在运行时检查对象的确切类型。在MFC(Microsoft Foundation Classes)框架中,RTTI被用来增强面向对象编程的能力,特别是对于多态性和动态...

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

    运行时类型信息(RTTI,Run-Time Type Information)是C++语言的一项特性,它允许程序在运行时查询和验证对象的精确类型。RTTI对于异常处理、多态性以及类型安全的转换至关重要。C++标准提供了两个主要的手段来利用...

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

    在Java编程中,运行时类型识别(Runtime Type Identification,简称RTTI)是一种关键特性,它允许程序在运行时检查对象的实际类型。RTTI是Java多态性的重要基础,使得代码能够根据对象的实际类型执行不同的操作。...

    强类型系统 RTTI 类型识别

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

    rtti-inspector-combo.zip_DELPHI RTTI_RTTIInspector_inspector

    在Delphi编程环境中,RTTI(Run-Time Type Information)是一种强大的特性,允许程序在运行时获取类型信息。...通过学习和使用这个示例,开发者可以提升他们的Delphi编程技能,尤其是对运行时类型信息的运用。

    java 泛型类的类型识别示例

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

    运行时类型识别(RTTI)原理.当你看到一种颜色,想知道它的RGB成分比,不查色表行吗?当你持有一种产品,想知道它的型号,不查型录行吗?要达到RTTI的能力,我们一定要在类构建起来的时候,记录必要的信息,已建立型录。型录中的类信息,最好以链表方式连接起来,将来方便一一比较

    运行时类型识别(RTTI,Runtime Type Information)是C++编程语言中的一种特性,允许程序在运行时查询对象的确切类型。RTTI提供了一种机制,使得代码可以在运行时检查对象的实际类型,这对于多态性编程和动态类型...

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

    Java的RTTI(Runtime Type Information,运行时类型信息)机制是Java语言的一个重要特性,它允许程序在运行时检查对象的实际类型。RTTI使得在编译时未知类型的对象能够在运行时进行适当的处理,从而增强了代码的灵活...

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

    运行时类型识别(RTTI,Runtime Type Information)是C++编程语言中的一种特性,允许程序在运行时查询对象的实际类型信息。RTTI 提供了一种方法来检查对象的动态类型,这对于多态性编程和处理类层次结构尤其有用。...

    rtti-obfuscator:混淆二进制文件中的所有RTTI(运行时类型信息)

    **rtti-obfuscator** 是一个专为C++编译器生成的二进制文件设计的工具,其主要目的是混淆其中的 **RTTI (Runtime Type Information)**,以增强程序的安全性和难以逆向工程的特性。在本文中,我们将深入探讨RTTI、其...

    Delphi-的RTTI机制浅探.doc

    介绍 RTTI 的基本概念、类和 VMT 的关系、类、类的类、类变量的关系、TObject.ClassType 和 TObject.ClassInfo、is 和 as 运算符的原理、TTypeInfo – RTTI 信息的结构、获取类的属性信息、获取方法的类型信息、获取...

    运行时类型识别PPT学习教案.pptx

    运行时类型识别(RTTI,Run-time type identification)是C++中的一种特性,它允许程序在运行时检查对象的确切类型。RTTI主要用于处理多态性,即在基类指针或引用下处理不同派生类对象的情况。在C++这种静态类型语言...

    Thinking_in_java(chapter10).pdf

    从给定文件的【部分内容】中我们可以了解到,该文档主要讲述了Java中运行时类型识别(RTTI)的原理和用途,以及Java中的反射机制。在此基础上,我们进一步探讨Java中RTTI和反射的相关知识点。 知识点一:运行时类型...

    识别c++ RTTI的ida脚本1

    C++的运行时类型信息(Runtime Type Information,简称RTTI)是一种强大的特性,它允许在程序运行时查询对象的实际类型。在深入探讨RTTI的实现机制之前,我们首先理解RTTI的基本概念。在C++中,类型识别分为静态识别...

    Java在运行时识别类型信息的方法详解

    Java 中的运行时类型识别(RTTI)机制是指在程序执行过程中,Java 虚拟机(JVM)可以识别出对象的真正类型信息,而不仅仅是引用类型。这项机制是通过 Class 类实现的。 Class 类是 Java 中的核心类之一,包含了关于...

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

    RTTI是Run-time Type Identification的缩写,即运行时类型识别。Java语言通过RTTI可以在运行时知道一个对象的类型信息。RTTI在Java中主要通过两种形式存在:一种是传统的类型转换,也就是instanceof关键字和类的...

    RTTI.rar_ RTTI_rtti

    运行时类型识别(Runtime Type Information,简称RTTI)是C++语言中的一种特性,它允许在程序运行期间获取对象的实际类型信息。RTTI是C++为面向对象编程提供的一项强大工具,尤其在多态性编程中,能够帮助我们实现更...

    java元数据——CLass类

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

    Delphi的RTTI机制文档

    RTTI,全称Runtime Type Information(运行时类型信息),是编程语言中的一种特性,允许程序在运行时获取对象的类型信息。在Delphi中,RTTI是一个强大的工具,它使得开发者能够在运行时检查、操作类的属性、方法和...

Global site tag (gtag.js) - Google Analytics