您所在的位置:主页 > JAVA技术 >

Java中的Class类

时间:2014-07-12 16:46来源:未知 作者:疯狂java 点击:


  Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息记录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和借口运行时的状态,当装载类时,Class类型的对象自动创建。

  Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。因此不能显式地声明一个Class对象。

  基本的Java类型(boolean、byte、char、short、int、long、float、和double)和关键字void也都对应一个Class对象。

  每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class对象。

  一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

  获取Class对象,一般有如下三种方法可以获取:

  1、Class.forName("类名字符串") 其中字符串必须是全称。

  2、类名.class

  3、实例对象.getClass()

  下面的程序可以观察一下啊Class对象的生成原理。

  public class TestClass {

  public static void main(String[] args)

  {

  try {

  // 测试Class.forName()

  Class testTypeForName = Class.forName("TestClassType");

  System.out.println("testForName---" + testTypeForName);

  // 测试类名.class

  Class testTypeClass = TestClassType.class;

  System.out.println("testTypeClass---" + testTypeClass);

  // 测试Object.getClass()

  TestClassType testGetClass = new TestClassType();

  System.out.println("testGetClass---" + testGetClass.getClass());

  } catch (ClassNotFoundException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }

  class TestClassType {

  // 构造函数

  public TestClassType() {

  System.out.println("----构造函数---");

  }

  // 静态的参数初始化

  static {

  System.out.println("---静态的参数初始化---");

  }

  // 非静态的参数初始化

  {

  System.out.println("----非静态的参数初始化---");

  }

  }

  程序的输出结果如下:

  ---静态的参数初始化---

  testForName---class TestClassType

  testTypeClass---class TestClassType

  ----非静态的参数初始化---

  ----构造函数---

  testGetClass---class TestClassType

  我们知道,静态方法属性初始化,是在类加载的时候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。前两种加载类的方式生成了Class对象,并将Class对象加载进了内存中,并初始化了静态的方法。因此,这段程序说明,三种方式生成Class对象,其实只有一个Class对象。在生成Class对象的时候,会首先判断内存中是否已经加载。

  所以,当编写一个新的Java类时,JVM会帮我们编译成class对象,存放在.class文件中。在运行时,当需要生成这个类的对象,JVM会检查此类是否已经装载进内存中。若没有装载,则把.class文件装入内存中。若是装载,则根据class文件生成实例对象。