在Jsp 容器中,在不同的webapp下,是可以存在相同的類的,那麼jsp容器是怎麼實現的呢,今天寫了個簡單的例子,和大家一起分享一下。
首先寫一個個App的類:
public class App implements Runnable{<br />public void run(){<br />System.out.println("this is first app!");<br />}<br />}<br />
app代表一個webapp,把app編譯的class檔案copy到目錄file:///workspace/ClassLoader/app1/目錄下。
把App代碼修改一下,將first改成second,把編譯的class檔案copy到目錄file:///workspace/ClassLoader/app2/下。
在寫一個類比的容器類Main:
import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.net.URLClassLoader;<br />/**<br /> * Class loader的測試<br /> *<br /> * @author markzhang<br /> *<br /> */<br />public class Main {<br />public static void app1() {<br />try {<br />URL[] urls = new URL[1];<br />urls[0] = new URL("file:///workspace/ClassLoader/app1/");<br />URLClassLoader cl = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());<br />Class c = Class.forName("App", false, cl);<br />System.out.println(c.getClassLoader());<br />Object obj = c.newInstance();<br />Runnable a = (Runnable) obj;<br />a.run();<br />}<br />catch (MalformedURLException e) {<br />e.printStackTrace();<br />}<br />catch (ClassNotFoundException e) {<br />e.printStackTrace();<br />}<br />catch (InstantiationException e) {<br />e.printStackTrace();<br />}<br />catch (IllegalAccessException e) {<br />e.printStackTrace();<br />}<br />}</p><p>public static void app2() {<br />try {<br />URL[] urls = new URL[1];<br />urls[0] = new URL("file:///workspace/ClassLoader/app2/");<br />URLClassLoader cl = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());<br />Class c = Class.forName("App", false, cl);<br />System.out.println(c.getClassLoader());<br />Object obj = c.newInstance();<br />Runnable a = (Runnable) obj;<br />a.run();<br />}<br />catch (MalformedURLException e) {<br />e.printStackTrace();<br />}<br />catch (ClassNotFoundException e) {<br />e.printStackTrace();<br />}<br />catch (InstantiationException e) {<br />e.printStackTrace();<br />}<br />catch (IllegalAccessException e) {<br />e.printStackTrace();<br />}<br />}</p><p>public static void main(String[] args) {<br />app1();<br />app2();<br />}<br />}<br />
把App原始碼刪除
運行:
java.net.URLClassLoader@c17164
this is first app
java.net.URLClassLoader@61de33
this is second app