类加载器[3]自定义类加载器[2]:URLClassLoader

【参考资料】

分析AppClassLoader,ExtClassLoaderURLClassLoader的关系http://blog.csdn.net/irelandken/article/details/7046689

 

在自定义类加载器中,我们自定义了一个CustomClassLoader用于从D:\temp目录下读取.class文件

但是实际上JDK已经给我们提供了URLClassLoader用于从URL路径中读取,可以直接拿来使用。


 

之前在讲内置类加载器中讲过:

其实可以简单的理解为,这些类加载器的处理逻辑都是相同的,读取.class字节码文件生成Class类,只不过是从不同的路径读取。

其实也是因为,AppClassLoaderExtClassLoader其实就是从URLClassLoader继承的。(上图中子类看不到这两个类,是因为这两个类并未在JDK中提供)

 

但是需要注意,虽然继承关系是AppClassLoader继承自URLClassLoader,但是父类委托关系依然是URLClassLoader位于最底端。(应该是AppClassLoader重新设置了parent

 

 Java Code 

 

package com.bjsxt.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class Test {

    
public static void main(String[] args) throws IOException {
        
try {
            URL[] urls=
new URL[]{new URL("file://D:/temp/")};
            
            ClassLoader loader=
new URLClassLoader(urls);
            Class<?> clazz = loader.loadClass(
"com.bjsxt.test.HelloLoader");
            Method declaredMethod = clazz.getDeclaredMethod(
"sayLoader", null);
            declaredMethod.invoke(null, null);
            
            
//输出自定义类加载器的父类委托关系
            while(loader!=null){
                System.out.println(loader);
                loader=loader.getParent();
            }
            
            
//输出AppClassLoader的继承关系
            ClassLoader appClassLoader = Test.class.getClassLoader();
            clazz = appClassLoader.getClass();
            
while(clazz.getSuperclass()!=null){
                System.out.println(clazz.getSuperclass());
                
                clazz=clazz.getSuperclass();
//反射获取父类类型
            }
            
        } 
catch (MalformedURLException e) {
            e.printStackTrace();
        } 
catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 
catch (NoSuchMethodException e) {
            e.printStackTrace();
        } 
catch (SecurityException e) {
            e.printStackTrace();
        } 
catch (IllegalAccessException e) {
            e.printStackTrace();
        } 
catch (IllegalArgumentException e) {
            e.printStackTrace();
        } 
catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值