深入理解Java加载类的机制

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

  /**

  * This class loader loads encrypted class files.

  */

  class CryptoClassLoader extends ClassLoader {

  /**

  * Constructs a crypto class loader.

  *

  * @param k

  *            the decryption key

  */

  public CryptoClassLoader(int k) {

  key = k;

  }

  protected Class findClass(String name) throws ClassNotFoundException {

  byte[] classBytes = null;

  try {

  classBytes = loadClassBytes(name);

  } catch (IOException e) {

  throw new ClassNotFoundException(name);

  }

  Class cl = defineClass(name, classBytes, 0, classBytes.length);

  if (cl == null)

  throw new ClassNotFoundException(name);

  return cl;

  }

  /**

  * Loads and decrypt the class file bytes.

  *

  * @param name

  *            the class name

  * @return an array with the class file bytes

  */

  private byte[] loadClassBytes(String name) throws IOException {

  String cname = name.replace('.', '/') + ".caesar";

  FileInputStream in = null;

  in = new FileInputStream(cname);

  try {

  ByteArrayOutputStream buffer = new ByteArrayOutputStream();

  int ch;

  while ((ch = in.read()) != -1) {

  byte b = (byte) (ch - key);

  buffer.write(b);

  }

  in.close();

  return buffer.toByteArray();

  } finally {

  in.close();

  }

  }

  private int key;

  }

  看看怎么实现一个自己的ClassLoader(我们以web应用的classloader为例来讲解)

  大家都很熟悉tomcat,比如我们要写一个servlet运行的话.

  1,我们通常会在tomcat的webapps目录下建一个自己的web目录(比如myweb),然后让自己的myweb至少具有以下目录结构.

  └─WEB-INF

  ├─classes

  └─lib

  2,直接把class文件拷贝到classes目录下,或者把自己做的servet打成jar放到lib下

  3,启动tomcat就能访问servlet了.

  再说一点:不少人了解struts,也做过基于struts的应用.其实struts对于我们来说只是几个jar而已,我们要在自己的应用中用 struts,

  只不过就象上面一样把struts的各个lib拷贝到web应用的WEB-INF/lib下就OK了.

  再综合前面的基础部分,其实web应用是有自己的classloader的,他专门负责加载WEB-INF/lib和WEB-INF /classes的类。下面我们就来模拟一下web应用的classloader,相信看了下面的代码你就会对classloader的理解又上一个台阶.

  import java.io.File;

  import java.io.FilenameFilter;

  import java.lang.reflect.Method;

  import java.net.MalformedURLException;

  import java.net.URL;

  import java.net.URLClassLoader;

  /*

  * web应用的classloader

  * 带你步入classloader的天堂

  */

  public class WebAppClassLoader{

  URLClassLoader myClassLoader = null;

  /*

  * 用法:new WebAppClassLoader(webRoot)

  *   比如:new WebAppClassLoader("c:/web")

  */

  public WebAppClassLoader(String root) {

  URL[] urls = null;

  try {

  urls = getJarURLs(root);

  } catch (MalformedURLException e) {

  System.out.println(e.getMessage());

  }

  myClassLoader = new URLClassLoader(urls);

  }

视频学习

我考网版权与免责声明

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

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

最近更新

社区交流

考试问答