java类型信息

来源:互联网 发布:js验证支付宝账号 编辑:程序博客网 时间:2024/09/21 09:23

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的子类。







 

原创粉丝点击