java中的Class类

Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类

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

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通

过调用类加载器 中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。

我们都知道所有的java类都是继承了object这个类,在object这个类中有

一个方法: getclass().这个方法是用来取得该类已经被实例化了的对象的该类的引用,这个引用指向的是Class类的对象(呵呵,有点别扭)。我们自己无法生成一个Class对象(构造函数为private),而这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成。 我们生成的对象都会有个字段记录该对象所属类在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
根据结果可以发现,三种生成的Class对象一样的。并且三种生成Class对象只打印一次“静态的参数初始化”。
我们知道,静态的方法属性初始化,是在加载类的时候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。
因此,这段程序说明,三种方式生成Class对象,其实只有一个Class对象。在生成Class对象的时候,首先判断内存中是否已经加载。 
所以,生成Class对象的过程其实是如此的:
当我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象


参考博客:http://www.blogjava.net/formatmyself/articles/21291.html

      http://blog.sina.com.cn/s/blog_78528687010158ev.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值