一.Class的由来
首先声明,class和Class是不一样的,Class也属于一个类class。
当一个Java程序运行时,java运行时系统会一直对所有的对象进行运行时类型标识,这项信息记录了每个对象所属的类。虚拟机通常会使用运行时类型信息选择正确的方法执行,用来保存这些类型消息的类就是Class类;
Class类封装了一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。
虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类(型)都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。
一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机或者通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。
当我们编写一个新的java类时,JVM就会帮我们编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。
二.Class对象生成
Class对象的生成方式如下:
1.使用Class类的中静态forName()方法获得与字符串对应的Class对象
Class.forName(“类名字符串”) (注意:类名字符串必须是全称,包名+类名)
Class c2=Class.forName(“lt.MyObject”)
2.类名.class
Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;
3.调用Object类的getClass()方法来得到Class对象
实例对象.getClass()
MyObject x;
Class c1 = x.getClass();
三.Class对象的常用方法
1、getName()
一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
2、newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader()
返回该类的类加载器。
4、getComponentType()
返回表示数组组件类型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray()
判定此 Class 对象是否表示一个数组类。
具体的方法参考:http://www.yiibai.com/java/lang/java_lang_class.html
四.Class的技巧
1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如
Object obj = Class.forName(s).newInstance();
2、虚拟机为每种类型管理一个独一无二的Class对象。因此可以使用==操作符来比较类对象。例如:
if(e.getClass() == Employee.class)…
五.附
classLoader参考:http://blog.csdn.net/xyang81/article/details/7292380
下篇我会跟着介绍java反射的原理