/*
* 获得web应用下的所有class的path的URL.
* 1,WEB-INF/classes目录
* 2,WEB-INF/lib下的所有jar文件
*/
private URL[] getJarURLs(String rootDirStr) throws MalformedURLException {
if (!rootDirStr.endsWith(File.separator)) {
rootDirStr += File.separator;
}
// classesDir就是web应用中的"WEB-INF/classes"目录
File classesDir = new File(rootDirStr + File.separator + "WEB-INF"
+ File.separator + "classes");
// classesDir就是web应用中的"WEB-INF/lib"目录
File libDir = new File(rootDirStr + File.separator + "WEB-INF"
+ File.separator + "lib");
// 找出目录下所有的jar文件
File[] jarFiles = null;
if (libDir.isDirectory()) {
jarFiles = libDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
// 注意"dir"参数指的是jar文件的父目录,"name"才是jar文件的
if (dir.isDirectory() // jar文件的父目录必须是一个文件夹
&& (name.endsWith(".jar") || name.endsWith(".zip"))) // 注意zip文件也是可以的哦
return true;
return false;
}
});
}
int jarCount = null == jarFiles?0:jarFiles.length;
URL[] urls = new URL[1 + jarCount];
urls[0] = classesDir.toURI().toURL();//WEB-INF/classes
for (int i = 0; i < jarCount; i++) {//WEB-INF/lib下的所有jar文件
urls[i + 1] = jarFiles[i].toURI().toURL();
}
return urls;
}
/*
*加载class,直接调用 myClassLoader的loadClass(className)方法
*/
public Class> loadClass(String className) throws ClassNotFoundException{
return myClassLoader.loadClass(className);
}
/**
* 测试WebAppClassLoader
* @param args
*/
public static void main(String[] mainArgs) {
try {
//请根据实际情况指定目录和类名
WebAppClassLoader classLoader = new WebAppClassLoader("c:/web/");
Class> c = classLoader.loadClass("classloader.ButtonTest");
//用反射调用main方法
String[] args = new String[] {};
Method m = c.getMethod("main", args.getClass());
m.invoke(null, (Object) args);
} catch (Exception e) {
// handle exception
e.printStackTrace();
}
}
}
测试自己的ClassLoader
1,在c盘建一个web目录(当然了,你可以把上面类的main改一下 使他适合自己的需求),然后子目录如下
└─WEB-INF
├─classes
└─lib
2,新写一个带main方法的类:classloader.ButtonTest(当然了,你可以把上面类的main改一下 使他适合自己的需求),然后打包成jar文件 放到web/WEB-INF/lib下(当然了,你也可以不打包,直接把你的类放到web/WEB-INF/classes下),如果你很懒,就copy 我下面的代码吧,顺便还可以了解了解AWT和SWING;##这个ButtonTest的main方法也可以不象下面这么复杂,就一个 System.out.print也可以的哦
package classloader;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonTest
{
public static void main(String[] args)
{
ButtonFrame frame = new ButtonFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。