java 反射运行时加载外部jar到Tomcat StandardClassLoader
加载jar这一部分很容易,可是卸载jar就没那么容易了。加载jar的时候需要用反射去调用URLClassLoader的addURL方法。Tomcat的StandardClassLoader继承于URLClassLoader。
<%@ page language="java" pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <%@page import="java.net.URL"%> <%@page import="java.lang.reflect.Method"%> <%@page import="java.net.URLClassLoader"%> <% URLClassLoader c = (URLClassLoader) getClass().getClassLoader().getParent().getParent(); URL jar = new URL("http://javaweb.org/jars.jar"); try { Method m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); m.setAccessible(true); m.invoke(c,new Object[]{jar}); URL[] url = c.getURLs(); for(URL u:url){ out.println(u+"<br/>"); } Class<?> test = Class.forName("com.javaweb.test.Test"); Method method = test.getDeclaredMethod("test",HttpServletRequest.class); Object obj = method.invoke(test.newInstance(), new Object[]{request}); out.println(method.getName()+":"+obj); }catch(Exception e){ e.printStackTrace(); } %>
jars.jar内容:
package com.javaweb.test; import javax.servlet.http.HttpServletRequest; public class Test{ public String test(HttpServletRequest request){ String str = request.getSession().getServletContext().getRealPath("/"); System.out.println(str); return str; } }
输出: