深入理解Java加载类的机制

来源:java认证发布时间:2012-11-12 13:12:40java认证视频

  /*

  * 获得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);

  }

  }

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答