zoukankan      html  css  js  c++  java
  • JVM(五),ClassLoader

    五、ClassLoader

    1.什么是ClassLoader

     

    2.四种ClassLoader

     

    3.自定义CLassLoader

     

    (1)MyClassLoader

    public class MyClassLoader extends ClassLoader {
        private String path;
        private String classLoaderName;
    
        public MyClassLoader(String path, String classLoaderName) {
            this.path = path;
            this.classLoaderName = classLoaderName;
        }
    
        //用于寻找类文件
        @Override
        public Class findClass(String name) {
            byte[] b = loadClassData(name);
            return defineClass(name, b, 0, b.length);
        }
    
        //用于加载类文件
        private byte[] loadClassData(String name) {
            name = path + name + ".class";
            InputStream in = null;
            ByteArrayOutputStream out = null;
            try {
                in = new FileInputStream(new File(name));
                out = new ByteArrayOutputStream();
                int i = 0;
                while ((i = in.read()) != -1) {
                    out.write(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    out.close();
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return out.toByteArray();
        }
    }

    原理还是通过ClassLoader中的deFineClass方法来获取Class类型对象,自定义的是路径

    (2)实现ClassLoaderChecker

    public class ClassLoaderChecker {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader");
            Class c = m.loadClass("Wali");
            c.newInstance();
        }
    }

     (3)实现效果

    4.类加载器的双亲委派机制

     

    为什么要使用双亲委派机制来加载class文件-避免多份同样的字节码的加载

    5.类的加载方式

     

    隐式加载:new

    显示加载:loadClassformName

    1)类装载过程

     

    2)代码实例区别

     

    public class LoadDifference {
        public static void main(String[] args) throws Exception {
            //loadClass加载类,需要调用c.newInstance()才会加载类
            ClassLoader cl = Robot.class.getClassLoader();
            Class c = cl.loadClass("com.interview.javabasic.reflect.Robot");
            c.newInstance();
            //forName加载类,在加载类的时候会将Static静态代码块的代码实现出来
            Class r = Class.forName("com.interview.javabasic.reflect.Robot");
        }
    }

      使用Class.forName(classname)才能在反射回去类的时候执行static块。3)数据库链接为什么使用Class.forName(className)

  • 相关阅读:
    .NET开源项目
    关于微信号的校验
    java 中关于synchronized的通常用法
    关于java 定时器的使用总结
    新的博客已经启用,欢迎大家访问(402v.com)
    Hadoop综合大作业
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    第三章 熟悉常用的HDFS操作
  • 原文地址:https://www.cnblogs.com/xzmxddx/p/10366880.html
Copyright © 2011-2022 走看看