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();
            }
        }
    }
  • 相关阅读:
    Tsql 获取服务器信息
    数据字典生成脚本 【转载】
    c# winform文本框数字,数值校验
    ReentrantLock和AbstractQueuedSynchronizer的分析
    多线程
    前缀和与差分数组
    链表
    堆(优先队列)
    排序算法
    二分查找(递归和非递归)
  • 原文地址:https://www.cnblogs.com/zhaww/p/8867065.html
Copyright © 2011-2022 走看看