Java类型信息全称为RTTI(Run Time Type Information)
要解释清楚,首先要了解Java中Class对象的存在和它的机制。Class对象是一个特殊的对象,因为它的名字容易与class关键字混淆,所以要注意区别,两者并不是一个概念。
Class对象中包含了创建类的相关信息,java用它来创建类的所有对象。每当编写一个新类时就会产生一个对应的Class对象(注意Class对象与编写的类对应)。对于Class对象还有许多应用,在以下代码中慢慢介绍:
上代码:
class Candy {
static { System.out.println("Loading Candy"); }
}
class Gum {
static { System.out.println("Loading Gum"); }
}
class Cookie {
static { System.out.println("Loading Cookie"); }
}
public class SweetShop {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
System.out.println("inside main");
new Candy();
System.out.println("After creating Candy");
try {
Class.forName("Gum");//!!!!!!!!!!!
} catch(ClassNotFoundException e) {
System.out.println("Couldn't find Gum");
}
System.out.println("After Class.forName(\"Gum\")");
new Cookie();
System.out.println("After creating Cookie");
}
}
可见代码里有一句
Class.forName(String str)作用:该方法返回与str相匹配的类
Class.forName(String str).newInstance()作用:获得类的实例,不过类型是Object.
如果要通过Class获得类的实例,完整的语句是:(str)Class.forName(String str).newInstance(); 注:当使用newInstance获得对象时要注意,该类必须具有默认的构造函数或者显示的无参数构造函数。
开始说了Class还有很多其他功能:getName() isInterface() getSimpleName() getCanonicalName() getInterfaces() getSuperclass() 。YY都能知道什么作用,我就不一一解释了。其中个体Interfaces()返回的是接口数组。
使用类字面常量也能获得Class对象引用,语法如:A.class。
注意:在调用forName()或使用类字面常量时都会执行对应类中的静态块与静态成员。(这就解释了类初始化顺序。------->当实例化一个类时首先初始化静态成员与块,然后是普通成员,然后是构造函数)
1、可以用泛型来限定Class对象的类型。语法:①Class<Integer> a=Integer.class;②Class<? extends Number> a=Integer.class③Class<? super Integer> a=Number.class;
注意:Class<Number> genericNumberClass=Integer.class;该语句是无法通过编译的,因为虽然Integer是Number的子类,但Integer Class并不是Number Class的子类。