Java——类加载机制


Java类加载器(Java Classloader)负责动态地将Java类加载到Java虚拟机的内存空间内,Java提供了3种类加载器,每个类加载器负责加载特定位置的Java类。

启动类加载器(Bootstrap ClassLoader)

  • 该类加载器由C++语言实现,负责加System.getProperty(“sun.boot.class.path”)所指定核心Java库,也可以通过java -Xbootclasspath指定其加载路径

可以把加载路径给打印出来

public class ClassLoaderTest {
   
	public static void main(String[] args) {
   
		System.out.println(System.getProperty("sun.boot.class.path"));
	}
}
D:\develop\jre\lib\resources.jar;
D:\develop\jre\lib\rt.jar;
D:\develop\jre\lib\sunrsasign.jar;
D:\develop\jre\lib\jsse.jar;
D:\develop\jre\lib\jce.jar;
D:\develop\jre\lib\charsets.jar;
D:\develop\jre\lib\jfr.jar;
D:\develop\jre\classes

扩展类加载器(Extension ClassLoader)

  • 该类加载器由sun.misc.Launcher$ExtClassLoader类实现(sun.misc.Launcher的内部类),负责加载System.getProperty(“java.ext.dirs”)所指定的Java的扩展库,也可以通过java -Djava.ext.dirs指定其加载路径.
  • 如果把自己的开发的jar包放在指定路径下,也会被加载。

创建一个学生类
在这里插入图片描述
导出jar并把jar拷贝到 jre文件夹\lib\ext 文件夹中
测试类

public class ClassLoaderTest {
   
	public static void main(String[] args) {
   
		System.out.println(System.getProperty("java.ext.dirs"));
		System.out.println(Student.class.getClassLoader().getClass().getName());
	}
}

未把导出的jar包拷贝到 jre\lib\ext目录中的结果

D:\develop\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.misc.Launcher$AppClassLoader

jar包拷贝之后的结果

D:\develop\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.misc.Launcher$ExtClassLoader

sun.misc.Launcher$ExtClassLoader类源码

static class ExtClassLoader extends URLClassLoader {
   
        static {
   
            ClassLoader.registerAsParallelCapable();
        }

        /**
         * create an ExtClassLoader. The ExtClassLoader is created
         * within a context that limits which files it can read
         */
        public static ExtClassLoader getExtClassLoader() throws IOException
        {
   
            final File[] dirs = getExtDirs();

            try {
   
                // Prior implementations of this doPrivileged() block supplied
                // aa synthesized ACC via a call to the private method
                // ExtClassLoader.getContext().

                return AccessController.doPrivileged(
                    new PrivilegedExceptionAction<ExtClassLoader>() {
   
                        public ExtClassLoader run() throws IOException {
   
                            int len = dirs.length;
                            for (int i = 0; i < len; i++) {
   
                                MetaIndex.registerDirectory(dirs[i]);
                            }
                            return new ExtClassLoader(dirs);
                        }
                    });
            } catch (java.security.PrivilegedActionException e) {
   
                throw (IOException) e.getException();
            }
        }

        void addExtURL(URL url) {
   
            super.addURL(url);
        }

        /*
         * Creates a new ExtClassLoader for the specified directories.
         */
        public ExtClassLoader(File[] dirs) throws IOException {
   
            super(getExtURLs(dirs), null, factory);
            SharedSecrets.getJavaNetAccess().
                getURLClassPath(this).initLookupCache(this);
        }

        private static File[] getExtDirs() {
   
            String s = System.getProperty("java.ext.dirs");
            File[] dirs;
            if (s != null) {
   
                StringTokenizer st =
                    new StringTokenizer(s, File.pathSeparator);
                int count = st.countTokens();
                dirs = new File[count
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值