如果没有加载过才加载的写法

1. 加载完就不加载的写法

1.1是不是可以参考双亲委派机制

1.2那就分析一下ClassLoader源码吧

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                try {
                    if (parent != null) {
                            // 注释1 parent 为父加载器,可以自定义一个classLoader 依次打印出所有父类
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    c = findClass(name);
                }
            }
            return c;
    }

注释1 :默认构造函数的classLoader为 PathClassLoader
parent 为父加载器,可以自定义一个classLoader 依次打印出所有parent

 private static ClassLoader createSystemClassLoader() {
        String classPath = System.getProperty("java.class.path", ".");
        String librarySearchPath = System.getProperty("java.library.path", "");

        // String[] paths = classPath.split(":");
        // URL[] urls = new URL[paths.length];
        // for (int i = 0; i < paths.length; i++) {
        // try {
        // urls[i] = new URL("file://" + paths[i]);
        // }
        // catch (Exception ex) {
        // ex.printStackTrace();
        // }
        // }
        //
        // return new java.net.URLClassLoader(urls, null);

        // TODO Make this a java.net.URLClassLoader once we have those?
        return new PathClassLoader(classPath, librarySearchPath, BootClassLoader.getInstance());
    }
2.1做法比较简单但是有几个要注意的地方
  1. 尽量不要在方法中直接return
  2. 注意函数单一性原则

总结

东西很简单,就是修改bug的时候突然想到的,大家遇到不知道怎么实现比较合理的时候其实可以参考源码,既可以了解源码是怎么实现的(说不定面试的时候用的上呢),也可以用到实践中。虽然简单但是也有意义!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、classLoader 类加载器,将class文件加载到JVM虚拟机内存中,使得程序可以运行。通常情况下,JV...
    helloWorld_1118阅读 2,230评论 0 2
  • JVM类加载机制 概述 类加载过程 加载 通过类的全限定名获取类的二进制流 将静态存储结构转化为方法区的运行时数据...
    东溪95阅读 3,075评论 0 15
  • 初识ClassLoader ClassLoader类加载器在Java中的定义就是用来加载其他类到Jvm中的操作类,...
    逐梦々少年阅读 1,231评论 1 5
  • 一:ClassLoader 从JVM结构图中可以看到,类加载器的作用是将Java类文件加载到Java虚拟机。 只有...
    阿菜的博客阅读 1,796评论 0 8
  • 原创 若愚的历险记 这是我们的第十一次相遇 我想告诉你,我找到那只杯子了。 ——《旺角卡门》 ...
    若愚历险记阅读 371评论 0 4