`

java 类加载器学习

 
阅读更多
引用
1.自定义类加载器

public interface InterfaceTest {
	public void test();
}


public class IntefaceImpl implements InterfaceTest {
	@Override
	public void test() {
		// TODO Auto-generated method stub
        System.out.println("------------");
	}
}


public class MyClassLoader extends ClassLoader{

	private String path = "/home/kevin/";  
	/**
	 * 加载本地class
	 */
    @Override  
    protected Class<?> findClass(String name) throws ClassNotFoundException {  
        String namePath = name.replace(".", "/");  
        String classPath = path + namePath + ".class";  
        InputStream is = null;  
        ByteArrayOutputStream os = null;  
        try {  
            is = new FileInputStream(new File(classPath));  
            os = new ByteArrayOutputStream();  
            int b = 0;  
            while ((b = is.read()) != -1) {  
                os.write(b);  
            }  
            byte[] bytes = os.toByteArray();  
            os.flush();  
            return defineClass(name, bytes, 0, bytes.length);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }finally{  
            try {  
                if(os!=null)  
                    os.close();  
                if(is!=null)  
                    is.close();  
            } catch (IOException e1) {  
                os=null;  
               is = null;  
            }         
        }  
        return null;  
    }
    /**
     * 此种方式加载的两个jar中的类无法相互访问,因为new URLClassLoader出来的类加载器是兄弟关系
     * 调用URLClassloader的protected方法addURL即可实现在需要时加载jar到loader中。
     * @throws Exception
     */
    public void test()throws Exception{
    	//加载jar包
    	File file = new File("/home/kevin/workspace/eclipsespace/JavaTest/bin/com/a.jar");
		URL uri = file.toURI().toURL();
		System.out.println(uri);
		
		//或者加载网络jar包
		uri = new URL("http://xxx.xxx.com/resources/ebook/a.zip");
		
		URLClassLoader load = new URLClassLoader(new URL[]{uri});
		System.out.println(load.loadClass("IntefaceImpl"));
	    
		((InterfaceTest)(load.loadClass("IntefaceImpl").newInstance())).test();
    }
    public static void main(String[] args) {  
        MyClassLoader myLoader = new MyClassLoader();  
        try {  
                 Class myClass = myLoader.loadClass("IntefaceImpl");  
                 Object obj = myClass.newInstance();
                 ((InterfaceTest)obj).test();
//                 Method method = myClass.getMethod("say", null);  
//                 method.invoke(obj, null);  
        } catch (Exception e) {  
             e.printStackTrace();  
        }  
    }  
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics