zoukankan      html  css  js  c++  java
  • 面向对象程序设计(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

  • 相关阅读:
    IT之光
    个人作业3——个人总结(Alpha阶段)
    结对编程2——单元测试
    个人作业2
    结对作业1
    个人作业1
    个人作业3——个人总结(Alpha阶段)
    结对编程2--单元测试
    个人作业2——英语学习APP案例分析
    结对编程1
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3576040.html
Copyright © 2011-2022 走看看