Java 类加载相关知识

来源:互联网 发布:怎么开通淘宝客 编辑:程序博客网 时间:2024/04/29 16:46

注意:本课重点是认识类加载器,及类加载器的加载顺序,了解自己类加载器的编写

Java内置三个类加载器,其中 BootStrap 内置于虚拟机中,不是Java语言编写,它是最始祖的类加载器;

ExtClassLoader和AppClassLoader是Java内置的类加载器,它们由Java语言编写,它们分别加载不同目录下的

Java类,它们加载的目录如上图的右方所示。

你可以编写自己的类加载器,你的类只需要继承 ClassLoader 类并实现相关方法即可,此主题下面会谈到。


有那么多类加载器,那这些类加载器如何分工的呢?  就是委托机制。

委托机制简单的说就是: 每个类加载器加载类时,又先委托给其上级类加载器.


如何编写自己的类加载器(暂时了解即可):

下面是一个示例代码:

public class MyClassLoader extends ClassLoader{private String classDir;public MyClassLoader(){}public MyClassLoader(String classDir){this.classDir = classDir;}//只看此方法即可,它是重点@Override        //覆盖父类findClass方法        protected Class<?> findClass(String name) throws ClassNotFoundException {//先得出要加载的类的名子String classFileName = classDir + "\\"  + name.substring(name.lastIndexOf('.')+1) + ".class";try {FileInputStream fis = new FileInputStream(classFileName);ByteArrayOutputStream  bos = new ByteArrayOutputStream();//解密类,并把解密好的类放到 bos 字节数组中cypher(fis,bos);fis.close();System.out.println("aaa");byte[] bytes = bos.toByteArray();//调用defineClass方法,返回自己类加载器加载的类return defineClass(bytes, 0, bytes.length);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}