`
pengzhoushuo
  • 浏览: 12862 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JDK源码研究之1(Lang包拾遗)

阅读更多
1、基本类型对应的对象类型:我们知道在Java中基本类型有:void byte char double float integer long short
其对应的对象类型分别为:Void Byte Character Double Float Integer Long Short,其实在这些类中都有一个final类型的基本类型成员,如
Byte类里面有个成员private final byte value,由于其成员是final的,所以一个Byte只有在其始化的时候指定值,其后便不可改变。
在对象类型里取得其对应的基本类型是通过native实现的 (Class<Byte>) Class.getPrimitiveClass("byte")来取得的。
有意思的是:在JDK1.5之后在每一个对象类型里面都缓存了-128 - 127的对应的对象类型,所部只需要调用其静态方法valueOf(byte b)(缓存仅供该方法使用),如果其参数范围在缓存提供的范围内,但不再
New Byte()而是从缓存中取得预先New的Byte。

2、作为所有对象的"始祖",Object类具有的一些重要的方法,如getClass hashCode clone notify notifyAll wait 方法都是native的。所以你在调用这些方法的时候应该知道,你调用的是虚拟机级别的原生程序。

3、Class类,在Java里包括基本数据类型都是一个Class如int 其实也是一个Class,在反射中这个类得到了大量的应用,其实其内部的重要方法如:forName isInstance isArray isPrimitive getName getSimpleName getDeclaredFields getDeclaredMethods getDeclaredConstructors
都是native的,也就是说在虚拟级级别已经实现了这些东西。为什么Java支持反射,其实说白了也是这个Class的存在,每一个类都有其对应的元数据的存在,存在JVM中的元数据信息可以通过native方法来获取。反射其实说白了也是像传说中的那么高深,如果让我来实现基于JAVA的KAVA语言的虚拟机
(假设条件成立),那么我会在编译期间把这个类的一些描述信息,如有多少个字段呀,字段名呀etc.存放进一个我用java实现的数据结构中,然后KAVA通过调用JAVA程序来取得那些信息,其实这跟反射一样的道理。

4、有关String,其实String内部就是final char[],因为它是final的,所以如果要改变它内部的字符,得新建一个String。如果想创建新的对象而又想让字符串作改变
就得使用在JDK1.5之后加入的一个类StringBuilder,这个类忽略了线程同步所以比StringBuffer具有更高的效率。另外关于String不提的是类似String a="abc"; String b= "abc";的做法,由于"abc"在编译期间就已经确实了,所以
JVM只会保留一份"abc",这根本也不是什么很高深的东东,任何一个学过编译原理的同学都知道这是任何一个编译器优化时必须做的事情。知道了String这个"轮子"的底层后,你是否在后悔你写了N多个大量应用String相加的程序呢?
如果这些字符具有前后顺序那换成StringBuilder.append方法吧。至于String.format方法经过测试,效率甚至还不如字符串相加。

5、一些重要的基础接口,如Cloneable Comparable Iterable、Readable Runnable,得益于面向接口编程的威力,底下有N个实现呀

6、一些预定义的annotation如: Deprecated Override SuppressWarnings 这些标注在1.5以后的编程中也是时有应用。

7、与线程有关的Thread ThreadGroup 其内部主要的方法也是native的。还有一个ThreadLocal其实也并不是什么创新,只是让不同的线程操作不同的备份,操作系统原理上有。

8、与数学有关的Math StrictMath都是一些静态方法的运用,主要用来进行数据计算。

9、Enum这个1.5之后才加上去的功能相当好用,其实其内部只不过是维护了枚举的名字和其顺序,如enum A{BOY,GIRL},其实BOY便是它的name,其顺序为1(或许是0),GIRL也是name,顺序为2(或许是1);
这个类是不能够被实例化的,只能免通过声明关键字enum来建枚举,你可以在程序中取得每个枚举的集合,并不是因为API提供了该接口,而是因为枚举在创建的时候编译器还会做一些"手脚"。


10、异常层次 如下:

Throwable ---->
Error
Exception
---->RuntimeException

值得注意的是,在SUN规定的标准里,RuntimeException是不要求进行try...catch的,当你正在做一个组件供他人调用,而又不希望他人使用try...catch的方式来使用你的
组件的时候,就可以抛出一个RuntimeException或其子类的异常。


11、一些不常用,但能够提供非常有用的功能的类
Process与ProcessBuilder创建进程,如果你想要利用ipconfig命令得到网卡参数就可以通过它
Runtime可以取得程序运行环境的一些东东,如主机CPU个数、内存容量大小等信息。
System不用说了,可以取得out,in,errr流,1.5之后加了一个console主要是用于方便控制台编程的
management包,通过ManagementFactory可以取得包括编译器,操作系统管理bean从而得到如操作系统架构等信息。不过该包里只包含了众多管理bean的接口,实现类在com.sun.management。
分享到:
评论
2 楼 pengzhoushuo 2010-10-09  
确实漏了boolean,但是void可以算作是一个基本类型,你可以查下jdk源码。
1 楼 zhangyou1010 2010-10-08  
1、基本类型对应的对象类型:我们知道在Java中基本类型有:void byte char double float integer long short

写错了吧,integer不是基本类型,void也不是,另外少了boolean类型。

相关推荐

    jdk源码-补充缺少sun包下的源码

    然而,对于理解和调试JDK内部机制,研究sun包下的源码是不可或缺的。 二、获取与补充sun包源码 补充缺失的sun包源码主要来源于OpenJDK项目,这是一个开源的JDK实现,其源码完全公开。OpenJDK的1.7分支包含了sun包...

    jdk源码(完整版)

    - **jdk**: 这是JDK的核心包,包含了诸如`java.lang`、`java.io`、`java.util`等基础类库,是所有Java程序的基础。 - **java**: 这个包下包含了许多Java语言的基本类,如`Object`、`String`、`Integer`等,以及I/O...

    JDK源码包(包含sun包下的源码)

    本压缩包提供的JDK源码包含了`sun`包,这意味着你可以研究诸如`sun.nio`(非阻塞I/O)、`sun.jdbc`(数据库连接)和`sun.security`(安全相关)等重要组件的实现细节。这些源码对于JDK的深度学习和性能优化有着极大...

    jdk源码 jdk源码

    Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。它包含了许多关键组件的源代码,使开发者能够深入探索Java语言的底层实现,从而提升编程技巧,优化性能,并理解标准库的工作原理。在这个...

    自己重新编译的jdk源码jar包

    对于想了解JDK源码的朋友来说,通过调试JDK源码来学习是一个常用的方法。但是默认的情况下eclipse是不支持进入jdk源码中进行调试和显示当前变量的。 我们要明白在jdk中,sun对rt.jar中的类编译时,去除了调试信息,这样...

    JDK8完整源码包

    这份"JDK8完整源码包"包含了JavaFX、Sun私有实现等核心组件的源代码,为深入理解Java平台的工作原理提供了宝贵的资源。 首先,JavaFX是Java的图形用户界面(GUI)库,自JDK 8起成为标准部分,它提供了丰富的UI组件...

    jdk-8u60源码

    总的来说,深入研究JDK 8u60的源码不仅能够提升我们的Java编程技能,还能让我们掌握更多的底层知识,比如JVM的工作原理、类加载机制、新的语言特性实现等。对于任何希望提升技术水平的Java开发者来说,这都是一次...

    JDK1.8 sun 包源码

    安装完JDK后,会在%JAVA_HOME% /jdk文件夹下生成一个src.zip,此文件夹对应rt.jar中的java源码,但细心研究后发现rt.jar中sun包下的文件不存在,也就是说sun包下的java源码并没有打包到src.zip中,可以到...

    jdk 源码 完整版

    这个包是Java语言最基础的部分,包含了语言的关键类库,如`java.lang`中的Object、String、Integer等基本类型和系统类,`java.io`中的输入/输出流操作,`java.util`中的集合框架,以及`java.awt`和`javax.swing`用于...

    JDK7源码 包含rt.jar包下的 sun包源码 sun.security包等源码

    总的来说,这个JDK7源码压缩包为开发者提供了一个深入研究Java平台和安全机制的宝贵资源。通过学习这些源码,开发者可以提升自己的技术水平,理解Java的内部运作,更好地优化代码,甚至参与到Java的开源项目中去。

    java JDK 源码

    Java JDK源码是Java开发工具包的原始代码集合,它为开发者提供了深入理解Java平台工作原理的机会。JDK源码包含了许多核心类库,如`javax`、`com`、`org`、`java`以及`launcher`和`sunw`等包下的类和接口。这些源文件...

    jdk源码包jdk-11.0.1

    这个源码包提供了对Java 11.0.1实现的深入理解,使得开发者可以查看和研究Java平台的核心源代码。 【描述】"jdk源码包"意味着这个压缩文件包含了Java开发工具集(JDK)的所有源代码。通过分析这些源码,开发者可以...

    jdk1.6源码包

    深入研究JDK 1.6源码包,不仅可以提升对Java平台的理解,还可以学习到软件设计模式、并发处理、内存管理等高级主题。同时,通过阅读源码,开发者可以发现潜在的性能优化点,提高程序的效率和稳定性。然而,随着Java...

    jdk 7 源码。含sun包下所有源码

    总的来说,深入研究JDK 7的源码,尤其是sun包下的核心组件和nio模块,不仅可以提升开发者对Java平台的理解,也有助于编写出更高效、稳定的代码。对于希望成为Java技术专家的开发者来说,这是一个不可或缺的学习环节...

    java的jdk源码包

    第一步:安装完jdk之后,打开jdk所在目录,里面有个src.zip,这就是此jdk的所有源码 第二步:找到之后我们开始导入,选中项目点击右键,选中Build Path栏中的Configure Build Path,在Libraries中我们打开JRE ...

    jdk 1.8源码包,包含sun源码,绝对真实,自己看大小就懂了,靠谱

    在"jdk-5b86f66575b7"这个压缩包中,很可能包含了JDK 1.8的完整源码,包括上述的"sun"包。这将为开发者提供一个深入了解Java运行机制、学习和调试代码的宝贵资源。然而,由于"sun"包中的部分源码是Oracle官方标记为...

    jdk8源码包

    通过研究这个"jdk8源码包",开发者可以深入了解Java 8的内部机制,这对于进行高级编程、优化代码性能以及调试异常情况都非常有帮助。此外,理解源码也有助于学习和掌握后续版本的Java更新,因为许多概念和设计思路都...

    jdk1.8 sun源码

    1. **Java虚拟机(JVM)的工作机制**:Sun JDK中的源码揭示了JVM如何加载类、执行字节码、垃圾收集等关键过程。例如,`java.lang.ClassLoader`类展示了如何动态加载类,`java.lang.reflect`包提供了对反射的支持。 ...

    jdk1.8源码,包含sun包

    在JDK 1.8中,`sun.*`包的源码通常是不公开的,因为它们涉及到了Java平台的内部实现,这些实现可能在不同的JVM版本中有所变化,直接使用可能会导致兼容性问题。然而,对于开发者来说,特别是那些需要深入研究Java...

    JDK源码(sun包)

    虽然研究sun包源码对开发者有诸多益处,但直接在生产环境中使用sun包的类可能会导致兼容性问题,因为这些类的API和行为可能在未来的JDK版本中改变。因此,除非必要,应避免在应用代码中直接引用sun包。 总结,JDK ...

Global site tag (gtag.js) - Google Analytics