zoukankan      html  css  js  c++  java
  • Java类加载器学习笔记

    今后一段时间会全面读一下《深入理解Java虚拟机》

    在这里先记一下在网上看到的几篇介绍 类加载器 的文章,等读到虚拟机类加载机制再详细介绍。

    超详细Java中的ClassLoader详解

    深入理解Java类加载器

    贴一个自己写的类加载器。

    Hello类。  把编译后的class文件放到别的路径下。

    package ww;
    
    public class Hello {
    
        public void say() {
            System.out.println("hello world");
        }
    
    }

    WwClassLoader类。  继承ClassLoader类 重写 findClass()方法

    package ww;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    
    public class WwClassLoader extends ClassLoader {
    
        private String path; //路径
        public WwClassLoader(String path) {
            this.path = path;
        }
    
        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            String fileName = parseFileName(name);
            File file = new File(path,fileName);
            try {
                //读取class文件
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int lenth = 0;
                while((lenth = fis.read()) != -1) {
                    baos.write(lenth);
                }
                byte[] buffer = baos.toByteArray();
                baos.close();
                fis.close();
                //实例化class对象
                return defineClass(name,buffer,0,buffer.length);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return super.findClass(name);
        }
    
        //解析文件路径
        private String parseFileName(String name) {
            int index = name.lastIndexOf('.');
            if(index == -1) {
                 return name+".class";
            } else {
                return name.substring(index+1)+".class";
            }
        }
    }

    WwTest类。   调用测试

    package ww;
    
    import java.lang.reflect.Method;
    
    public class WwTest {
        public static void main(String[] args) {
            //我一直在找为什么自己定义的类的parent节点一定是AppClassLoader类的源码。要是知道的大佬可以告诉我一声
            /*private static native void registerNatives();
            static {
                registerNatives();
            }*/
            WwClassLoader ww = new WwClassLoader("E://lib");
            try {
                Class hel = ww.findClass("ww.Hello");
                //反射执行方法
                if (hel != null) {
                    Object obj = hel.newInstance();
                    Method method = hel.getDeclaredMethod("say", null);
                    method.invoke(obj, null);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    [转]Maven类包冲突终极三大解决技巧
    python chardet 模块
    python pretty-errors模块
    认识执行时机
    python对象销毁顺序
    python字符串驻留
    python绘图练习
    小练习2
    小练习
    4G 内存处理 10G 大小的文件
  • 原文地址:https://www.cnblogs.com/zhaww/p/8867065.html
Copyright © 2011-2022 走看看