`
许真恩
  • 浏览: 38728 次
  • 来自: ...
社区版块
存档分类
最新评论

JAVA从头来

阅读更多
三个月计划、从头开始补缺补漏JAVA

[目标]
     1、掌握知识的用法、包括JAVA,WEB,J2EE
     2、培养 "研究深"、"完全弄通"的习惯、任何知识学透、想透、用透
      3、摸索一下学习方法论、也就是学习作者是如何推导出其所要证实的结论的

[关键]
       关键要学而用、一定要用;在用中巩固所学消化所学

[计划]

四月计划  JAVA知识

1、JDK 相关 : 安装、常用命令及其参数、JVM内存管理和CLASSLOADER
2、JAVA语法
3、JAVA面向对象特性 继承、构造器、抽象类、接口、多态、重载、覆盖、异常处理机制
4、JAVA类库:四个类库 java.lang,java.io,java.util,java.sql


五月计划 WEB知识

1、HTTP协议
2、Servlet和JSP
3、MVC
4、TOMCAT

六月计划 J2EE知识

JNDI、JTA、RMI、JMS、UML、设计模式、SPRING、AOP




分享到:
评论
3 楼 许真恩 2008-04-08  
第5章 package和import

javac在找到待执行的JRE后、启动JRE、然后启动三个classloader、各个classloader根据其类装载路径loader自己的类、然后javac开始尝试编译类、比如

c:\java\javac com\neil\pay\Consumer.java

javac 在JRE就绪后做下面的事情来完成Consumer.java的编译

1、根据classpath构建类路径参考表、作为本次编译进行的根路径
2、解析Consumer.java 类的import部分、确保在以1建立的根路径下可以找到Consumer.java 中import中声明的类和包、如果包不存在抛出package don't exsit、如果类不存在抛出can't resolve symbol
3、继续解析Consumer.java、找出其用到的所有的其他的类、一般会找出两种声明类型的类、比如Consumer.java中使用了User类以及com.neil.pay.Address.java类、对于User类、javac会先根据2中得到的信息、把User类名补全(比如补全为com.neil.pay.User.java)、然后在1根路径下查找是否存在com.neil.pay.User.java、找到后就编译他、如果找不到或者找到多个、那么编译失败;对于com.neil.pay.Address.java类其实不用再判断是否存在、因为2中已经检查过了;

上述描述中还有好多种情况没有描述出来、慢慢想投了再补充

我希望最终我可以清楚的写一篇javac/java 运行内幕!!
2 楼 许真恩 2008-04-04  
--第2章--深入类加载器

1、类加载器的作用

顾名思义、类加载器就是用来从文件系统中把静态类加载到虚拟机中、即把.class文件加载到虚拟机中、而虚拟机中把所有载入其中的类描述为一个个的Class、所以可以这么认为:类加载器加载某个类到虚拟机中、其结果就是在虚拟机中创建了这个.class文件的Class实例、大胆假设、以后从这个类new出来的一个个对象其实是根据这个.class文件的Class实例来创建的;

总结一下:类加载器负责加载静态类文件到虚拟机中、并创建其Class实例

2、JAVA的几种类加载器及其关系

有三种类加载器:根类加载器(BootStrap ClassLoader)、扩展类加载器(ExtClassLoader)、应用类加载器(AppClassLoader、又称系统类加载器SystemClassLoader)

BootStrap ClassLoader是用C++语言编写的
ExtClassLoader 是用java语言编写的
AppClassLoader 是用java语言编写的


从类的继承关系来讲ExtClassLoader 和 AppClassLoader 都集成自URLClassLoader
URLClassLoader允许指定从那个目录下来加载类

BootStrap ClassLoader默认从System的key=sun.boot.class.path指向的路径来加载类
ExtClassLoader 默认从System的key=java.ext.dirs指向的路径来加载类
AppClassLoader 默认从System的key=ClassPath指向的路径来加载类

你可以通过System.getProperty(String)来看出上述key的值

而三种类加载器都定义了一个属性为parent、改parent引用了另外一个类加载器(我不愿意用父加载器来描述、这常常和类的继承概念混淆了)

3、虚拟机启动过程

虚拟机启动时首先会产生BootStrap ClassLoader(不是载入)、该BootStrap ClassLoader的parent=null、然后BootStrap ClassLoader载入ExtClassLoader、并把其parent置为BootStrap ClassLoader、然后BootStrap ClassLoader载入AppClassLoader 、并把其parent置为ExtClassLoader;至此三种类加载器都已经在虚拟机中激活可用了、然后BootStrap ClassLoader就根据sun.boot.class.path指向的路径下的类都加载到虚拟机内、ExtClassLoader根据java.ext.dirs指向的路径下的类加载到虚拟机内、但此时AppClassLoader并不会把classpath指向目录的类都加载到虚拟机内、对于这些类只有在真正需要载入的的时候AppClassLoader才会帮我们加载

4、类加载机制

   1)类加载器载入一个类时,会先请求其parent指向的类加载器来加载类、如果其parent指向的类加载器在其类加载路径中加载不到需要的类时那么改类加载器才尝试自己来加载、而"寻找parent指向的类加载器"动作是具有递归性、也就是会一直找到BootStrapClassLoader
   2)在虚拟机启动后默认是用AppClassLoader来作为起始的类加载器
    3)如果类A最终是被类加载器CC加载的、那么类A中引用的类会用CC来作为其实类加载器进行

5、总和应用

[题目]
     在cmd下执行java Test 系统做了什么?

[描述]
1、确认哪个java.exe被执行:读取系统变量path、找出第一个含有java.exe的路径并执行
2、确认哪个JRE被使用:找到了java.exe、那么变根据java.exe查找JRE的机制来定位JRE(前面的评论已经描述过了)、启动之、JRE为我们创建BootStrapClassLoader实例、然后BootStrapClassLoader实例为我们创建ExtClassLoader和AppClassLoader实例、而后类加载器BootStrapClassLoader和ExtClassLoader载入其设定目录下的所有类
3、查找Test.class并加载到虚拟机中、调用Test.class的main方法:AppClassLoader类加载器作为起点来请求其parent加载器ExtClassLoader来加载Test.class、ExtClassLoader又会请求其parent加载器BootStrapClassLoader来加载Test.class、如果在BootStrapClassLoader或ExtClassLoader的类加载路径下发现了Test.class、那么便把类载入、否则AppClassLoader便尝试自己从ClassPath下来查找类并加载;而如果Test.class是被BootStrapClassLoader加载到了、如果Test.class引用了My.class类、那么默认会把BootStrapClassLoader作为起点类加载来加载My.class

最后就是执行Test.class的main方法了










1 楼 许真恩 2008-04-03  
-JAVA深度历险-笔记

第2章

1、描述JDK、JRE、JVM 之间的关系

JDK:Java Develope Kit
JRE:Java Runtime Envierment
JVM:Java Virtual Machine

* JDK所提供的javac.exe/java.exe等java都是用java语言写的
* 所有java语言写的程序都需要在JRE中运行
* javac.exe/java.exe等用java语言写的都需要在JRE中允许
* 安装sun提供的JDK时、会安装两个JRE、一个是JDK安装目录下的JRE、一个是     C:/prog~/java下的JRE;
* javac.exe/java.exe执行过程包括很关键的一步:查找JRE;首先查找javac.exe/java.exe所在目录的JRE、其次查找javac.exe/java.exe的父目录、最后查找注册表中注册的JRE

所以执行javac.exe/java.exe时关键要确认的
1)哪一个javac.exe/java.exe被执行
2)哪一个JRE被执行

相关推荐

Global site tag (gtag.js) - Google Analytics