面向对象程序设计(OOP)的六大原则

1、定义:

寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。

2、种类:

  • BootstrapClassLoader:用C++编写的,装载jre中的核心类库;
  • ExtClassLoader:装载jre目录下的ext中的jar类;
  • AppClassLoader:装载ClassPath路径下的类.
  • UrlClassLoader:装载Url指定的类;

3、测试:

Java代码 复制代码 收藏代码
  1. public class Test {   
  2.   
  3.     public static void main(String[] args) {   
  4.   
  5.         ClassLoader loader = Test.class.getClassLoader();   
  6.         while (loader != null) {   
  7.             System.out.println(loader.getClass().getName());   
  8.             loader = loader.getParent();   
  9.         }   
  10.         System.out.println(loader);   
  11.   
  12.     }   
  13.   
  14. }  

 输入结果:

sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null

说明:

  • null:BootstrapClassLoader是用C++编写,而JVM设置ExtClassLoader的父加载器是null罢了;

4、一个自定义类加载器的例子:

Java代码 复制代码 收藏代码
  1. package classloader;   
  2.   
  3. import java.io.ByteArrayOutputStream;   
  4. import java.io.File;   
  5. import java.io.FileInputStream;   
  6.   
  7. /**  
  8.  *   
  9.  * 一、ClassLoader加载类的顺序  
  10.  *  1.调用 findLoadedClass(String) 来检查是否已经加载类。  
  11.  *  2.在父类加载器上调用 loadClass 方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。   
  12.  *  3.调用 findClass(String) 方法查找类。  
  13.  * 二、实现自己的类加载器  
  14.  *  1.获取类的class文件的字节数组  
  15.  *  2.将字节数组转换为Class类的实例  
  16.  *   
  17.  */  
  18. public class ClassLoaderTest {   
  19.   
  20.     public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {   
  21.         //新建一个类加载器   
  22.         MyClassLoader cl = new MyClassLoader("myClassLoader");   
  23.         //加载类,得到Class对象   
  24.         Class<?> clazz = cl.loadClass("classloader.Animal");   
  25.         //得到类的实例   
  26.         Animal animal=(Animal) clazz.newInstance();   
  27.         animal.say();   
  28.     }   
  29.   
  30. }   
  31. class Animal{   
  32.     public void say(){   
  33.         System.out.println("hello world!");   
  34.     }   
  35. }   
  36. class MyClassLoader extends ClassLoader {   
  37.     //类加载器的名称   
  38.     private String name;   
  39.     //类存放的路径   
  40.     private String path = "E:\\workspace\\Algorithm\\src";   
  41.   
  42.     MyClassLoader(String name) {   
  43.         this.name = name;   
  44.     }   
  45.        
  46.     MyClassLoader(ClassLoader parent, String name) {   
  47.         super(parent);   
  48.         this.name = name;   
  49.     }   
  50.     /**  
  51.      * 重写findClass方法  
  52.      */  
  53.     @Override  
  54.     public Class<?> findClass(String name) {   
  55.         byte[] data = loadClassData(name);   
  56.         return this.defineClass(name, data, 0, data.length);   
  57.     }   
  58.     public byte[] loadClassData(String name) {   
  59.         try {   
  60.             name = name.replace(".""//");   
  61.             FileInputStream is = new FileInputStream(new File(path + name + ".class"));   
  62.             ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  63.             int b = 0;   
  64.             while ((b = is.read()) != -1) {   
  65.                 baos.write(b);   
  66.             }   
  67.             return baos.toByteArray();   
  68.         } catch (Exception e) {   
  69.             e.printStackTrace();   
  70.         }   
  71.         return null;   
  72.     }   
  73.   
  74. }  

本代码来自:http://www.oschina.net

原文地址:https://www.cnblogs.com/bjanzhuo/p/3576040.html