- Java编译后,每个类生成一个.class文件;相应的,每个类都有一个对应的Class对象。
- 在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。
- 如果没有被加载,JVM会根据类的名称找到.class文件并加载它。
- 一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。
- 参考博客:
- http://my.oschina.net/aminqiao/blog/262601
- http://blog.csdn.net/a379039233/article/details/6158816/
下面的代码片段描述了Class类和ClassLoader类的部分使用方法,供参考。
package com.company;
class MyTest{
public int mA;
public MyTest(){
mA = 0;
}
}
class MyTest2{
static {
System.out.println("首次加载类MyTest2");
}
public MyTest2(){System.out.println("创建MyTest2类的一个新对象ing");}
}
class MyTest3{
static {
System.out.println("首次加载类MyTest3");
}
public MyTest3(){System.out.println("创建MyTest3类的一个新对象ing");}
}
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
System.out.println("Class类型基本方法测试");
try{
MyTest test = new MyTest();
Class testClass = test.getClass();
System.out.println("getPackage().getName()=" + testClass.getPackage().getName());
System.out.println("testClass.getName()="+testClass.getName());
System.out.println("testClass.getSimpleName()="+testClass.getSimpleName());
}catch (Exception e){
e.printStackTrace();
}
System.out.println("Class.forName动态加载类测试");
try {
Class test2class = Class.forName("com.company.MyTest2");
System.out.println("~~bong~~");
MyTest2 test22 = (MyTest2) test2class.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("Class.getClassLoader类加载器测试");
try{
Class class0 = Class.forName("com.company.Main");
ClassLoader classLoader = class0.getClassLoader();
if(classLoader == null){
System.out.println("getClassLoader returns null");
} else {
System.out.println(classLoader);
ClassLoader p = classLoader.getParent();
System.out.println(p);
System.out.println((p == null) ? "null ptr": p.getParent());
}
}catch (Exception e){
e.printStackTrace();
}
System.out.println("ClassLoader加载类测试");
try{
Class class0 = Class.forName("com.company.Main");
ClassLoader classLoader = class0.getClassLoader();
/***
* classLoader.loadClass("com.company.MyTest3") 等价于
* Class.forName("com.company.MyTest3", false, classLoader)
*/
Class test3class = Class.forName("com.company.MyTest3", true, classLoader);
System.out.println("--beng--");
MyTest3 test23 = (MyTest3) test3class.newInstance();
}catch(Exception e){
e.printStackTrace();
}
}
}