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

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

相关推荐

    java 泛型类的类型识别示例

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

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

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

    Thinking_in_java(chapter10).pdf

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

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

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

    第11章 运行期类型鉴定.pdf

    Java提供了两种获取运行时类型信息的方式。除了上述的“传统”RTTI,还有Java 1.1引入的**反射(Reflection)**机制。反射允许程序在运行时动态地访问和操作类、接口、字段和方法的信息,即使在编译时这些信息未知。...

    深入理解Java类型信息(Class对象)与反射机制

    RTTI(Run-Time Type Identification)是运行时类型识别,通常在C++中提及,但Java也有类似的概念。在Java中,Class对象扮演了RTTI的角色,它在运行时提供了识别对象类型和类信息的能力。 传统RTTI假定在编译时已知...

    Java开发技术大全 电子版

    第9章运行时类型识别288 9.1RTTI的作用288 9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断所属类292 9.6利用反射获取运行时类信息293 9.6.1...

    net学习笔记及其他代码应用

    答:RTTI:类型识别系统。 18.net中读写数据库需要用到那些类?他们的作用? 答:DataSet:数据存储器。 DataCommand:执行语句命令。 DataAdapter:数据的集合,用语填充。 19.ASP.net的身份验证方式有哪些?分别...

Global site tag (gtag.js) - Google Analytics