`

java类加载机制

阅读更多

java的类加载器有3种:

引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

可以通过以下代码查看3中类加载器的路径

System.out.println(System.getProperty("sun.boot.class.path"));
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(System.getProperty("java.class.path"));

 

类加载器的双亲委派模型:

如果一个类收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传到顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

 

自定义类加载器:

可以通过继承 java.lang.ClassLoader类的方式实现自己的类加载器。

public class MyClassLoader extends ClassLoader{
	//类加载器的名称  
    private String name;  
    //类存放的路径  
    private String path;  
    MyClassLoader(String path, String name) {  
    	this.path = path;
        this.name = name;  
    }  
	
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] data = loadClassData(name);  
        return this.defineClass(name, data, 0, data.length);
	}
	private byte[] loadClassData(String name) {  
        try {  
            name = name.replace(".", "//");  
            FileInputStream is = new FileInputStream(new File(path + name + ".class"));  
            ByteArrayOutputStream baos = new ByteArrayOutputStream();  
            int b = 0;  
            while ((b = is.read()) != -1) {  
                baos.write(b);  
            }  
            is.close();
            return baos.toByteArray();  
        } catch (Exception e) {  
            e.printStackTrace();  
        } 
        return null;  
    }  

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		//新建一个类加载器  
        MyClassLoader cl = new MyClassLoader("E:\\workspace\\src\\", "myClassLoader");  
        //加载类,得到Class对象  
        Class<?> clazz = cl.loadClass("com.Student");  
        //调用类的实例方法
        Object obj = clazz.newInstance();
        Method sayMethod = clazz.getMethod("say", new Class[] {});   
        sayMethod.invoke(obj, new Object[] {});  
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics