Java中Class类工作原理详解

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

1.Class对象

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

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

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

SweetShop.java

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”);

}

}

结果:

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实例

package com.zj.sample;

class Point {

int x, y;

}

class ClassTest {

public static void main(String[] args) {

Point pt = new Point();

Class c1 = pt.getClass();

System.out.println(c1.getName());

try {

Class c2 = Class.forName(”com.zj.sample.Point”);

System.out.println(c2.getName());

} catch (Exception e) {

e.printStackTrace();

}

Class c3 = Point.class;

System.out.println(c3.getName());

Class c4 = int.class;

System.out.println(c4.getName());

Class c5 = Integer.TYPE;

System.out.println(c5.getName());

Class c6 = Integer.class;

System.out.println(c6.getName());

}

}

结果:

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()实例化一个对象:

package com.zj.sample;

class Point {

static {

System.out.println(”Loading Point”);

}

int x, y;

}

[1][2]

因为冲动会做下让自己无法挽回的事情。

Java中Class类工作原理详解

相关文章:

你感兴趣的文章:

标签云: