1.Class对象

Class对象包含了与类相关的信息。事实上,Class对象就是用来创建类的所有的“普通”对象的。

类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个 新类,就会产生一个Class对象(恰当地说,是被保存在一个同名的.class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的 Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。如果尚未加载,JVM就会根据类名查找.class文件,并将其载入。

一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。看下面示例。

SweetShop.java



结果:

inside main       
Loading Candy       
After creating Candy       
Loading Gum       
After Class.forName("Gum")       
Loading Cookie       
After creating Cookie       
2.获取Class实例的三种方式        
1)利用对象调用getClass()方法获取该对象的Class实例。        
2)使用Class类的静态方法forName(),用类的名字获取一个Class实例。        
3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。       
3.Class.forName        
上面的示例中:        
Class.forName("com.zj.sample.Gum");       
这个方法是Class类(所有Class对象都属于这个类)的一个static成 员。Class对象就和其它对象一样,我们可以获取并操作它的引用。forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文 本名的String作输入参数,返回的是一个Class对象的引用。       
4.类字面常量       
Java还提供了另一种方法来生成对Class对象的引用,即使用“类字面常量”。对上述程序来说,可以是:       
com.zj.sample.Gum.class;       
5.关键字instanceof        
关键字instanceof返回一个布尔值,判断是不是某个特定类型的实例。        
if(x instanceof Dog) ((Dog)x).bark();       
6.获取Class实例        


结果:        
com.zj.sample.Point       
com.zj.sample.Point       
com.zj.sample.Point       
int       
int       
java.lang.Integer       
7.Class的其他方法        
1)Class.newInstance()使用所选的Class对象生成该类的新 实例。它调用了缺省(无参数)的类构造器生成新的对象。所以使用newInstance()创建的类必须有一个缺省构造器。对于newInstance ()来说,可以在原先没有任何对象存在的情况下,使用它创建一个新的对象。       
利用newInstance()实例化一个对象:        


结果:        
Loading Point       
2)Class.isInstance()方法提供了一种动态地调用instanceof运算符的途径。        
3)Class.getInterfaces()方法返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口。        
4)如果有一个Class对象,那么就可以通过getSuperclass()获取它的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个对象完整的类层次结构。       
5)Class类支持反射的概念,Java附带的库 java.lang.reflect包含了Field、Method以及Constructor类(每个类都实现了Member接口)。这些类型的对象是 由JVM在运行时创建的,用以表示未知类里对应的成员。这样可以使用Constructor创建新的对象,用get()和set()方法读取和修改与 Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外,还可以调用getFields()、getMethods、 getConstrucotrs()方法,返回表示字段、方法以及构造器的对象的数组。       
8.利用反射API察看未知类的构造方法与方法       


结果:        
Loading Point       
com.zj.sample.Point(int,int)       
void com.zj.sample.Point.output()       
9.动态调用一个类的实例(完全没有出现point这个名字)        


结果:        
Loading Point       
x=0,y=1


package com.zj.sample;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) {System.out.println("inside main");new Candy();System.out.println("After creating Candy");try {Class.forName("com.zj.sample.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");}}