一个ClassLoader的简单例子

    技术2022-05-20  42

    在Jsp 容器中,在不同的webapp下,是可以存在相同的类的,那么jsp容器是怎么实现的呢,今天写了个简单的例子,和大家一起分享一下。

    首先写一个个App的类:

    public class App implements Runnable{ public void run(){ System.out.println("this is first app!"); } }  

    app代表一个webapp,把app编译的class文件copy到目录file:///workspace/ClassLoader/app1/目录下。

    把App代码修改一下,将first改成second,把编译的class文件copy到目录file:///workspace/ClassLoader/app2/下。

    在写一个模拟的容器类Main:

    import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; /** * Class loader的测试 * * @author markzhang * */ public class Main { public static void app1() { try { URL[] urls = new URL[1]; urls[0] = new URL("file:///workspace/ClassLoader/app1/"); URLClassLoader cl = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); Class c = Class.forName("App", false, cl); System.out.println(c.getClassLoader()); Object obj = c.newInstance(); Runnable a = (Runnable) obj; a.run(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } public static void app2() { try { URL[] urls = new URL[1]; urls[0] = new URL("file:///workspace/ClassLoader/app2/"); URLClassLoader cl = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); Class c = Class.forName("App", false, cl); System.out.println(c.getClassLoader()); Object obj = c.newInstance(); Runnable a = (Runnable) obj; a.run(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } public static void main(String[] args) { app1(); app2(); } }  

    把App源代码删除

     

    运行:

     

    java.net.URLClassLoader@c17164

    this is first app

    java.net.URLClassLoader@61de33

    this is second app

     


    最新回复(0)