JDK源代码学习-基础类
一、概述
1、Java,是一套语言规范,例如规定了变量如何定义、控制语句如何写等,提供基本的语法规范。JDK是java自带的一套调用组件,是对基本java语法规范的进一步封装,jdk中都是使用java基本的语法来写的,使用JDK能够更好的使用java。当然,自己也可以写一套JDK。自己在项目中也可以不使用自带的JDK,而使用原生的基本语法。
2、在整个JDK API中,大约包含1200个包,包名主要有三种:java、javax和org。其中以java开头的包名是JDK的基础语言包,以javax开头的属于JDK扩展包(其中x是extend的简写),而以org开头的则是第三方组织提供的功能包(org是organization的简写)。而在JDK API中还包含了一些以com.sun开头的包名,这些是SUN公司提供的一些功能包,由于这些包中的类随着JDK版本的更改变化很大,不具备兼容性,所以未在标准的JDK API文档中进行公开。
3、rt.jar文件是java运行时类库,是我们用到最多的基础类库,包括java.lang,java.io,java.net,java.util等。
java.lang
:Java语言包,这个包下的文件不需要显式import。包括:Object类,数据类型相关的类(String,Long,Byte),Class类,线程相关类Thread,异常类Throwable,等。
java.io
:I/O操作相关的类。包括:文件类File,FileReader,FileWriter,输入输出流InputStream/OutputStream,等。
java.net
:网络相关类。包括:http连接类HttpURLConnection,socket类,等。
java.util
:工具类。包括:数据结构相关的类ArrayList、Hashmap,日期类Date,随机数类Random,等。
7、每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
12、动态加载和创建Class对象,比如想根据用户输入的字符串来创建对象
String str = 用户输入的字符串
Class t = Class.forName(str);
t.newInstance();
13、在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想,才有这两种创建方式。Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。例如:
Class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();
其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();
进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();
上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。
14、从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:这个类已经加载和这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。这样分步的好处是显而易见的。我们可以在调用类的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。
15、用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
public class People { private String name;
private int age;
private String gender; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public void say() {
System.out.println("Hello world!");
} public String showInfo() {
return "My name is " + this.name;
} } public class ClassTest { public static void main(String[] args) {
try {
//先加载类,再创建实例,等同于People tim = new People();
People tim = (People) Class.forName("com.tim.People").newInstance();
tim.say(); // 获取tim这个对象的类描述信息,
// 可以获取:类的构造方法,已经声明的字段、方法,获取类或者方法的注解,获取类的包名、父类,以及判断类是否是数组、是否是枚举、是否是接口
// 主要针对不清楚类的内部信息时,使用该方法获取
Class peopleClass = tim.getClass();
Field[] peopleField = peopleClass.getDeclaredFields();//获取类的字段
for (Field field : peopleField) {
System.out.println(field.getName());
} } catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} }
JDK源代码学习-基础类的更多相关文章
- JDK源代码学习系列07----Stack
JDK源代码学习系列07----Stack 1.Stack源代码很easy ...
- JDK源代码学习系列04----ArrayList
JDK源代码学习系列04----ArrayList 1 ...
- JDK源代码学习系列05----LinkedList
JDK源代码学习系列05----LinkedList 1.LinkedList简单介绍 LinkedList是基于双向 ...
- JDK源代码学习系列03----StringBuffer+StringBuilder
JDK源代码学习系列03----StringBuffer+StringBuilder 因为前面学习了StringBuffer和StringBuilder的父类 ...
- JDK源代码学习-ArrayList、LinkedList、HashMap
ArrayList.LinkedList.HashMap是Java开发中非常常见的数据类型.它们的区别也非常明显的,在Java中也非常具有代表性.在Java中,常见的数据结构是:数组.链表,其他数据结 ...
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现
本文转载自http://www.ibm.com/developerworks/cn/java/j-lo-tree/ 目录: TreeSet 和 TreeMap 的关系 TreeMap 的添加节点 Tr ...
- [Java] LinkedList / Queue - 源代码学习笔记
简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...
- 调试JDK源代码-一步一步看HashMap怎么Hash和扩容
调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...
- 无法debug断点跟踪JDK源代码——missing line number attributes的解决方法
在项目工程->Properties->Java Build Path->Libraries中导入的JRE System Library库里,给jar包添加JDK源代码包后,能够直接打 ...
随机推荐
- H5 可堆叠的圆环进度条,支持任意数量子进度条
by Conmajia SN: S22-W1M 由来 看到一篇帖子<vue实用组件--圆环百分比进度条>,让我想起了很多年前我在WinForm下仿制过的Chrome进度条. ▲ 原版进度条 ...
- 清理dns缓存
dns缓存是什么? DNS缓存指DNS返回了正确的IP之后,系统就会将这个结果临时储存起来.并且它会为缓存设定一个失效时间 (例如N小时),在这N小时之内,当你再次访问这个网站时,系统就会直接从你电脑 ...
- async/Await使用和原理
await/async是.NetFramework4.5出现的,是语法糖,由编译器提供的功能! await/async 是C#保留关键字,通常是成对出现,一般的建议是:要么不用,要么用到底 async ...
- C# 数组Array
数组是对相同类型的一组数据的封装.数组定义的时候,要说明是对哪一种类型的封装,并且要指定长度. using System; using System.Collections.Generic; usin ...
- socket,模拟服务器、客户端通信
服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...
- eclipse导入java工程
1)File下的import选项 2)点击General,选择Existing Projects into Workspace,点击next 3)点击Browse,在弹出的窗口中选择导入工程所在的文件 ...
- Sublime Text3介绍和插件安装——基于Python开发
Subime编辑器是一款轻量级的代码编辑器,是收费的,但是可以无限期使用.官网下载地址:https://www.sublimetext.com. Sublime Text3支持语言开发种类多样,几乎可 ...
- Java文件上传之SpringMVC实例
一.配置文件 web.xml <?xml version="1.0" encoding="UTF-8"?><web-app version=& ...
- Simulink 产品说明
Simulink 产品说明 仿真和基于模型的设计 Simulink® 是一个模块图环境,用于多域仿真以及基于模型的设计.它支持系统级设计.仿真.自动代码生成以及嵌入式系统的连续测试和验证.Simuli ...
- C#零基础入门-1-安装IDE
安装VS2017 下载安装,选择C#开发语言,过程略. 也可以使用VS2015