Java在真正使用一个类似才会加以加载,而不是在程序启动时就加载所有的类。Class类没有公开的构造函数。Class对象由JVM自动产生。每当一个类被加载时,JVM就自动为其生成一个Class对象。声明参考名称时类不会被加载,在使用new生成对象时类才会被加载。下面的代码是java.lang.Class类的简单使用。
public class classTest
{
public static void main(String[] args)
{
String str = "yoyo";
Class<? extends String> strClass = str.getClass();
System.out.println(strClass.getName());
Class<String> stringClass = String.class;
System.out.println(stringClass.getName());
System.out.println(int.class);
System.out.println(Integer.class);
System.out.println(boolean.class);
System.out.println(Boolean.class);
System.out.println(void.class);
System.out.println(Void.class);
int[] array = new int[10];
Class<? extends int[]> arrayClass = array.getClass();
System.out.println(arrayClass.getName());
System.out.println(arrayClass.isArray());
System.out.println(arrayClass.isEnum());
System.out.println(arrayClass.isInterface());
System.out.println(arrayClass.isPrimitive());
System.out.println(arrayClass.getSuperclass().toString());
testDemo test = null;
System.out.println("Start");
test = new testDemo();
System.out.println("End");
}
}
class testDemo
{
static
{
System.out.println("******");
}
}
输出结果为:
java.lang.String
java.lang.String
int
class java.lang.Integer
boolean
class java.lang.Boolean
void
class java.lang.Void
[I
true
false
false
false
class java.lang.Object
Start
******
End
可以使用Class的静态forName()方法实现动态加载类。Class的静态forName()方法有两个版本:
static Class forName(String name) 和
static Class forName(String name, boolean initialize, ClassLoader loader)
在加载类的时候,默认是如果类中有定义静态区块则会运行它。如果将initialize设置为false,则在加载类时不会立即运行静态区块,而是在使用类建立对象时才允许静态区块。如下面的代码。
package org.yoyo.test;
import java.lang.reflect.Modifier;
public class Test
{
public static void main(String[] args)
{
try
{
// Class<?> c1 = Class.forName("org.yoyo.test.staticDemo");
// getResult(); //输出:CAB
Class<?> c2 = Class.forName("org.yoyo.test.staticDemo", false, Thread.currentThread().getContextClassLoader());
getResult();
System.out.println(c2.getName());
System.out.println(c2.getPackage().getName());
System.out.println(c2.getModifiers());
System.out.println(Modifier.isInterface(c2.getModifiers()));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void getResult()
{
System.out.print("A");
staticDemo test = null;
System.out.print("B");
test = new staticDemo();
System.out.println();
}
}
class staticDemo
{
static
{
System.out.print("C");
}
}
输出结果为:
ABC
org.yoyo.test.staticDemo
org.yoyo.test
0
false