-----------------------------android培训、java培训、期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------
JVM
1. ClassLoader(类加载器)
2. JVM 提供了三种类加载器
1) 根类加载器(使用C++编写,程序员无法在 Java 代码中获得该类)
2) 扩展加载器,使用 Java 代码实现
3) 系统加载器(应用加载器) ,使用Java 代码实现
3. 用户自定义的类加载器都是 java.lang.ClassLoader 的子类
4 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。例如:
package com.shengsiyuan.classloader;
class CL
{
static
{
System.out.println("Class CL");
}
}
public class Test7
{
publicstatic void main(String[] args) throws Exception
{
// 获得系统类加载器
ClassLoader loader =ClassLoader.getSystemClassLoader();
Class<?>clazz = loader.loadClass("com.shengsiyuan.classloader.CL");//加载类
//调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化,
System.out.println("----------------------------");
clazz =Class.forName("com.shengsiyuan.classloader.CL");//给类实例化
}//此时 是对类的主动使用,返回一个类的实例,会导致类的初始化。不在用New对象
结果是:
-------------------
Class CL
5 父子加载器并非继承关系,也就是说子加载器不一定是继承了父加载器。是一种组合的关系。除了以上虚拟机自带的加载器外,用户可以自定义加载器(User-defined Class Loader),Java提供了抽象类java.lang.ClassLoader,所有的用户自定义的类加载器应继承ClassLoader类。
6 当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统类加载器就将成为该类加载器的父加载器。
7
自定义一个加载器
public class MyClassLoader extendsClassLoader
{
privateString name; //类加载器的名字
privateString path = "d:\\"; // 加载类的路径
privatefinal String fileType = ".class"; // class文件的扩展名
publicMyClassLoader(String name)
{
super(); // 让系统类加载器成为该类加载器的父加载器
his.name = name;
}
publicMyClassLoader(ClassLoader parent, String name)
{
super(parent); // 显式指定该类加载器的父加载器
this.name = name;
}
@Override
publicString toString()
{
return this.name;
}
publicString getPath()
{
return path;
}
publicvoid setPath(String path)
{
this.path = path;
}
@Override
public Class<?>findClass(String name) throws ClassNotFoundException//按指定方式将一个字节数组转化字节对象。返回一个class对象。
{
byte[] data = this.loadClassData(name);
return this.defineClass(name, data, 0,data.length);
}
privatebyte[] loadClassData(String name)
{
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = null;
try
{
this.name= this.name.replace(".", "\\");
is= new FileInputStream(new File(path + name + fileType));
baos= new ByteArrayOutputStream();
intch = 0;
while(-1!= (ch = is.read()))
{
baos.write(ch);
}
data= baos.toByteArray();
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
is.close();
baos.close();
}
catch(Exceptionex)
{
ex.printStackTrace();
}
}
return data;
}
public static void main(String[] args) throwsException
{
MyClassLoader loader1 = new MyClassLoader("loader1");
loader1.setPath("d:\\myapp\\serverlib\\");
MyClassLoader loader2 = newMyClassLoader(loader1, "loader2");
loader2.setPath("d:\\myapp\\clientlib\\");
//
// MyClassLoader loader3 = newMyClassLoader(null, "loader3");
//
// loader3.setPath("d:\\myapp\\otherlib\\");
//
// test(loader2);
//
// System.out.println("----------");
//
// test(loader3);
Class clazz =loader1.loadClass("Sample");//加载类
Object object =clazz.newInstance(); //创建一个Sample类的对象,实例
Sample sample = (Sample)object;//向下类型转换
System.out.println(sample.v1);//通过反射可以突破不同的命名空间的限制,加载器加载类。
-----------------------------android培训、java培训、期待与您交流!----详细请查看:http://edu.csdn.net/heima---------------