java 命名空间别名_java 命名空间 命名规则

java 命名空间 命名规则

更新时间:2008年01月30日 20:55:09   作者:

java 命名空间 命名规则

摘要

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的初始类装载器。

图 1 parent delegation模型

需要指出的是,Class Loader是对象,它的父子关系和类的父子关系没有任何关系。一对父子loader可能实例化自同一个Class,也可能不是,甚至父loader实例化自子类,子loader实例化自父类。假设MyClassLoader继承自ParentClassLoader,我们可以有如下父子loader:

ClassLoader loader1 = new MyClassLoader();

//参数 loader1 为 parent

ClassLoader loader2 = new ParentClassLoader(loader1);

那么parent delegation模型为什么更安全了?因为在此模型下用户自定义的类装载器不可能装载应该由父亲装载器装载的可靠类,从而防止不可靠甚至恶意的代码代替由父亲装载器装载的可靠代码。实际上,类装载器的编写者可以自由选择不用把请求委托给parent,但正如上所说,会带来安全的问题。

命名空间及其作用

每个类装载器有自己的命名空间,命名空间由所有以此装载器为初始类装载器的类组成。不同命名空间的两个类是不可见的,但只要得到类所对应的Class对象的reference,还是可以访问另一命名空间的类。

例2演示了一个命名空间的类如何使用另一命名空间的类。在例子中,LoaderSample2由系统类装载器装载,LoaderSample3由自定义的装载器loader负责装载,两个类不在同一命名空间,但LoaderSample2得到了LoaderSample3所对应的Class对象的reference,所以它可以访问LoaderSampl3中公共的成员(如age)。

例2  不同命名空间的类的访问

/*LoaderSample2.java*/import java.net.*;import java.lang.reflect.*;public class LoaderSample2 {    public static void main(String[] args) {        try {            String path = System.getProperty("user.dir");            URL[] us = {new URL("file://" + path + "/sub/")};            ClassLoader loader = new URLClassLoader(us);            Class c = loader.loadClass("LoaderSample3");            Object o = c.newInstance();            Field f = c.getField("age");            int age = f.getInt(o);            System.out.println("age is " + age);        } catch (Exception e) {            e.printStackTrace();        }    }

}

/*sub/Loadersample3.java*/public class LoaderSample3 {    static {        System.out.println("LoaderSample3 loaded");    }    public int age = 30;}

编译:

javac LoaderSample2.java;

javac sub/LoaderSample3.java

运行:java LoaderSample2

LoaderSample3 loaded

age is 30

从运行结果中可以看出,在类LoaderSample2中可以创建处于另一命名空间的类LoaderSample3中的对象并可以访问其公共成员age。

运行时包(runtime package)

由同一类装载器定义装载的属于相同包的类组成了运行时包,决定两个类是不是属于同一个运行时包,不仅要看它们的包名是否相同,还要看类装载器是否相同。只有属于同一运行时包的类才能互相访问包可见的类和成员。这样的限制避免了用户自己的代码冒充核心类库的类访问核心类库包可见成员的情况。假设用户自己定义了一个类java.lang.Yes,并用用户自定义的类装载器装载,由于java.lang.Yes和核心类库java.lang.*由不同的装载器装载,它们属于不同的运行时包,所以java.lang.Yes不能访问核心类库java.lang中类的包可见的成员。

总结

在简单讨论了类装载器,parent delegation模型,命名空间,运行时包后,相信大家已经对它们的作用有了一定的了解。命名空间并没有完全禁止属于不同空间的类的互相访问,双亲委托模型加强了Java的安全,运行时包增加了对包可见成员的保护。

相关文章

1a1b05c64693fbf380aa1344a7812747.png

这篇文章主要介绍了spring结合struts的代码详解,需要的朋友可以参考下2017-09-09

4f55910a645b073bc4fc65dc10dc14bd.png

下面小编就为大家带来一篇解决maven build 无反应,直接terminated的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-06-06

0ea3c7666119d5615e582f823fb3fad6.png

这篇文章主要介绍了java 中ThreadLocal 的正确用法的相关资料,需要的朋友可以参考下2017-03-03

4f96a78db829b1556ff16de21e013c7a.png

这篇文章主要介绍了使用IDEA创建SpringBoot项目的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05

8cc1031babc6aff2319f1c6af8544aa0.png

这篇文章主要介绍了使用redis的increment()方法实现计数器功能案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11

0c932a99bb7b6f23c937db507070cc7b.png

这篇文章主要介绍了Java实现数字转成英文的方法,涉及java数组与字符串的相关操作技巧,需要的朋友可以参考下2015-05-05

cca732bf65a93ed2ec0ac80c638460fe.png

这篇文章主要介绍了java eclipse 整个项目或包查找只定字符串并替换操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09

2d9f31f2af7b675a3d153d2b7f1035a7.png

这篇文章主要介绍了在java面试过程中hibernate比较常见的问题,包括Hibernate的检索方式,Hibernate中对象的状态,Hibernate的3种检索策略是什么,Session的find()方法以及Query接口的区别等方面问题的总结,需要的朋友可以参考下2015-07-07

b452cee8ec5cd9e58ab98eba17281e59.png

这篇文章主要介绍了Java实现的校验银行卡功能,结合完整实例形式分析了java针对银行卡类型、归属地等信息的判断、读取相关操作技巧,需要的朋友可以参考下2018-06-06

f4838ec7e2d4da28e0b57d4e852dadd4.png

本篇文章主要介绍了详解Spring Cloud Zuul中路由配置细节,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-10-10

最新评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值