谈谈Java中的类型识别RTTI
很多新手在学习编程的时候看到好多书上都有什么RTTI的一点讲解,觉得很重要但是自己一般好像又用不到,所以就放一边去了,这种学习的态度不好啊,原理性的东西要好好学习啊!!
1.什么是RTTI??
RTTI是运行时类型识别的简写(run-time type identification).
RTTI可以在有一个指向基类对象的引用时,让你找出这个对象的确切类型.
2.谈谈Class对象
程序运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型识别。这象信息记录了每个对象所属的类。用来保存这些信息的类是Class类.
每个类都有一个Class对象,也就是说每当编译了一个新类时就会产生一个Class对象(被保存在同名的.class文件中),在运行时,如果需要生成这个类的对象时候(注意是需要),Java虚拟机(JVM)就会根据类名查找.class文件,并将其载入,所以Java程序并不是一开始执行就被完全加载的。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象.
示例程序:
package MyJava.Base;
class Student
{
{
//静态块在类第一次被加载的时候执行
static
{
System.out.println("Loading Student");
}
static
{
System.out.println("Loading Student");
}
}
class Teacher
{
static
{
System.out.println("Loading Teacher");
}
{
static
{
System.out.println("Loading Teacher");
}
}
class Coder
{
static
{
System.out.println("Loading Coder");
}
{
static
{
System.out.println("Loading Coder");
}
}
public class RTTIDemo
{
public static void main(String[] args) throws Exception
{
System.out.println("Inside main");
new Student();
System.out.println("After creating Student");
try
{
Class.forName("Teacher");
}catch(Exception ex)
{
System.out.println(ex);
}
System.out.println("After Class.forname(Teacher)");
new Coder();
System.out.println("After creating Coder");
}
{
public static void main(String[] args) throws Exception
{
System.out.println("Inside main");
new Student();
System.out.println("After creating Student");
try
{
Class.forName("Teacher");
}catch(Exception ex)
{
System.out.println(ex);
}
System.out.println("After Class.forname(Teacher)");
new Coder();
System.out.println("After creating Coder");
}
}
3.类型转换前的检查
Java中有"类型安全的向下转型",什么叫类型安全的向下转型呢???
就是转换前使用instanceof关键字判断后再转换,否则会有异常产生,
当系统中类的程序中关系比较复杂时需要用instanceof来判断类型,维持秩序,
不过有可能尽量使用多态了!!
4.获得Class类对象的方法
a) Class cl = e.getClass();
b) String className = “JFrame”;
Class cl = Class.forName(className);
c) Class cl = JFrame.class;
注意:Class对象实际上描述的只是类型,而这类型未必是类,如:int不是类,int.class是一个Class类型的对象
5.利用Class对象生成同类型的实例:
Object m = Class.forName(“JFrame”).newInstance();
newInstance方法使用默认构造器初始化新建对象,如果需要以名称创建的类的构造器提供参数,就必须使用Constructor类中的newInstance方法