.exe 而 javac.exe 只有在 jdk\bin 目录下有 javac.exe 会自动调用 JDK 所在目录下的那套 JRE , 因此在编译时 JVM 会找到函数库, 所以编译不会发生
问题, 但在执行时,键入 java xxx 的时候会优先执行 system32 下的 java.exe 因此会自动调用 program files 目录下的那套 JRE(稍后解释) 所以要执行就必须把外部 jar 文件放到相应 jre\lib\ext 目录下 JDK\jre\bin\下有两个目录 server,client 两个目录下都会有 jvm.dll client 目录下的 jvm.dll 较小 server 目录下的较大 ----------------------系统默认 path C:\Documents\Administrator>set path Path=C:\WINDOWS\system32; C:\WINDOWS; C:\WINDOWS\System32\Wbem PATHEXT=.COM; .EXE; .BAT; .CMD; .VBS; .
VBE; .JS; .JSE; .WSF; .WSH 在 system32目录 底下找不到 JRE 目录, c:\windows 目录 也找不到 JRE 目录的情况 在 下,根据下一个逻辑,就是去
查询注册表 C:\Program Files\Java\jre1.xx 该目录下的 bin 子目录却只有看到 client 子目录,却没有 看到 server 子目录。这就是为何在一开始执行 java -server -version 会报错的原因 ------------------------------------ ============================ ============================ JAVA 类加载器 ============================ ============================ 有了动态性, 我们的应用程序就可以在不用全盘重新编译的情况下更新系统, 或者在不 用停止主
程序运作的情况下,除去系统中原有的 bug,或者是增加原本不具备的新功能。 一般来说,常见的程序语言先天上并不具有动态性的本质,如 C、C++本身就不具备动 态性。因此,为了让这些本身不具有动态性的程序语言具有某种程度的动态性, 就必须依赖底层的操作系统提供一些机制来实现动态性,Windows 操作
系统底下的动 态联结函式库(Dynamic Linking Library) 和 Unix 底下的共享对象(Share Object) 要运用这些底层操作系统所提供的机制必须多费一些功夫来撰写额外的程序代码(例如 Windows 平台上需要使用 LoadLibrary() 与 GetProcAddress()
, 两个 Win32 API 来完成动态性的需求),这些额外撰写的程序代码也会因为
作业平台的 不同而不同,毕竟这些额外的程序代码与程序本身的运作逻辑甚少关联, 所以维护起来虽不算复杂,但仍有其难度。 每个类对 java 机来说, 都是一个独立的动态联结函数库, 只不过扩展名不是.dll 或.so 而 是.class 所以可以在不重新编译其他 java 程序代码的情况下,只修改需要修改的执行单位,并 放入文件系统中,等下次该 java 虚拟机重新启动时, 这个逻辑上的 Java 应用程序就会因为加载了新修改的.class 文件,自己的功能也做了更 新。这是一个最基本的动态性功能。
JSP/Servlet 之类的 Web Container 或者高档的 Application Server 里的 EJB Container 他 们会提供一个 Hot Deployment 功能。 即在不关闭 Web Server 的情况下,放入已编译好的新 Servlet 以取代旧的 Servlet,下次 Http request 时,就会自动释放旧的 servlet 而重载新的 servlet。 程序运行时需要的核心类库位于 jre\lib\rt.jar 中 类加载器的作用就是把类从表态的硬盘 .class 文件,复制一份到内存中,并做一此 始 化
工作 java.exe 就是利用几个原则找到 JRE 后,把.class 直接转交给 JRE 运行后便功成身退 public class test { public static void main(String[] args) { System.out.println("Hello DD"); } } javac test.java java -verbose:class test -----------------------------------------------------classloader 的两种载入方式: 1)pre-loading 预先载入,载入基础类 2)load-on-demand 按需求载入 只有实例化一个类时,该类才会被 classloader 载入,仅仅申明并不会载入 基础类库是预先加载的(pre-loading) 用户所写的一般类是按需加载的(load-on-demand) 按需加载 三个