java 命名空间 命名规则第1/2页

时间:2021-06-06 14:20:19 

摘要                                                                                      
    Java的类装载器是Java动态性的核心,本文将向大家简要介绍Java的类装载器,及相关的parent delegation模型,命名空间,运行时包等概念,同时讨论一些在学习中容易混淆的问题。 

类装载器的功能及分类

    顾名思义,类装载器是用来把类(class)装载进JVM的。JVM规范定义了两种类型的类装载器:启动类装载器(bootstrap)和用户自定义装载器(user-defined class loader)。 

   bootstrap是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。如java.lang.Object是由bootstrap装载的。 

   Java提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。 System Class Loader是一个特殊的用户自定义类装载器,由JVM的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过ClassLoader.getSystemClassLoader() 方法得到。

例1,测试你所使用的JVM的ClassLoader

/*LoaderSample1.java*/public class LoaderSample1 {    public static void main(String[] args) {        Class c;        ClassLoader cl;
        cl = ClassLoader.getSystemClassLoader();        System.out.println(cl);
        while (cl != null) {            cl = cl.getParent();            System.out.println(cl);        }        try {            c = Class.forName("java.lang.Object");            cl = c.getClassLoader();            System.out.println("java.lang.Object's loader is " + cl);            c = Class.forName("LoaderSample1");            cl = c.getClassLoader();            System.out.println("LoaderSample1's loader is " + cl);        } catch (Exception e) {            e.printStackTrace();        }    }}
在我的机器上(Sun Java 1.5)的运行结果

C:\java>java LoaderSample1
sun.misc.Launcher$AppClassLoader@82ba41
sun.misc.Launcher$ExtClassLoader@923e30
null
java.lang.Object's loader is null
LoaderSample1's loader is sun.misc.Launcher$AppClassLoader@82ba41

第一行表示,系统类装载器实例化自类sun.misc.Launcher$AppClassLoader 

第二行表示,系统类装载器的parent实例化自类sun.misc.Launcher$ExtClassLoader 

第三行表示,系统类装载器parent的parent为bootstrap 

第四行表示,核心类java.lang.Object是由bootstrap装载的 

第五行表示,用户类LoaderSample1是由系统类装载器装载的 

parent delegation模型

   从1.2版本开始,Java引入了双亲委托模型,从而更好的保证Java平台的安全。在此模型下,当一个装载器被请求装载某个类时,它首先委托自己的parent去装载,若parent能装载,则返回这个类所对应的Class对象,若parent不能装载,则由parent的请求者去装载。

   如图1所示,loader2的parent为loader1,loader1的parent为system class loader。假设loader2被要求装载类MyClass,在parent delegation模型下,loader2首先请求loader1代为装载,loader1再请求系统类装载器去装载MyClass。若系统装载器能成功装载,则将MyClass所对应的Class对象的reference返回给loader1,loader1再将reference返回给loader2,从而成功将类MyClass装载进虚拟机。若系统类装载器不能装载MyClass,loader1会尝试装载MyClass,若loader1也不能成功装载,loader2会尝试装载。若所有的parent及loader2本身都不能装载,则装载失败。

   若有一个能成功装载,实际装载的类装载器被称为定义类装载器,所有能成功返回Class对象的装载器(包括定义类装载器)被称为初始类装载器。如图1所示,假设loader1实际装载了MyClass,则loader1为MyClass的定义类装载器,loader2和loader1为MyClass的初始类装载器。

12下一页阅读全文

标签:Java,类装载器,命名空间
0
投稿

猜你喜欢

  • Java方法重载和重写原理区别解析

    2022-09-28 14:29:04
  • 使用java实现猜拳小游戏

    2023-11-25 17:30:16
  • javascript 在线文本编辑器实现代码

    2023-11-24 23:07:24
  • C#中类与接口的区别个人总结

    2023-05-08 17:29:40
  • Android应用开发中模拟按下HOME键的效果(实现代码)

    2023-03-09 00:13:14
  • Android高级动画篇之SVG矢量动画范例

    2022-09-28 11:01:00
  • C#遍历指定目录下所有文件的方法

    2021-08-29 05:52:44
  • Java网络编程TCP实现聊天功能

    2023-12-01 17:05:35
  • Android仿一点资讯收藏Toast动画效果

    2022-01-15 18:42:33
  • Android Studio 3.x版本 的输入法遇到的坑及解决方案

    2023-03-19 03:13:40
  • win7配置adb环境变量的方法步骤

    2022-11-10 16:45:12
  • Netty实现简易版的RPC框架过程详解

    2023-05-23 23:19:58
  • SpringBoot整合Web之AOP配置详解

    2022-01-17 21:38:11
  • java简单手写版本实现时间轮算法

    2023-01-05 14:50:38
  • Chrome Visual Studio 2005下的编译过程

    2022-06-06 02:54:23
  • android实现简易计算器

    2023-06-21 04:26:09
  • Android实现输入法弹出时把布局顶上去和登录按钮顶上去的解决方法

    2022-11-10 15:07:26
  • Springboot项目快速实现拦截器功能

    2022-10-05 12:34:50
  • Java接口和抽象类有什么区别

    2021-08-21 07:01:18
  • 基于opencv实现车道线检测

    2023-03-11 10:07:52
  • asp之家 软件编程 m.aspxhome.com