zetavg/zh-tw-wikipedia huggingface dataset:
JavaScript库列表

下面是知名 JavaScript 庫的列表。

## 約束編程

* Cassowary
* CHR.js

## 面向 DOM (操縱)

* Google Polymer
* Dojo Toolkit
* jQuery
* midori
* MooTools
* Prototype JavaScript 框架

## 圖形 / 視覺化 (canvas 或 SVG 有關)

* AnyChart
* D3.js
* FusionCharts
* Highcharts
* JavaScript InfoVis Toolkit
* p5.js
* Pixi.js
* Plotly
* Processing.js
* Raphaël
* SWFObject
* Teechart
* Three.js
* Velocity.js
* Verge3D
* WhitestormJS

## GUI (圖形化使用者介面) 和構件有關

* Angular 出自 Google
* AngularJS 出自 Google
* Bootstrap
* Dojo Widgets
* Ext JS 出自 Sencha
* Foundation 出自 ZURB
* jQuery UI
* jQWidgets
* OpenUI5 出自 SAP
* Polymer 出自 Google
* qooxdoo
* React.js
* SmartClient
* Webix
* WinJS

### 不再活躍開發的

* Glow
* Lively Kernel
* Script.aculo.us
* YUI 庫

## 純 JavaScript/Ajax

* Google Closure Library
* Joose
* JsPHP
* Microsoft's Ajax library
* MochiKit
* PDF.js
* Rico
* Socket.IO
* Spry framework
* Underscore.js

## 模板系統

* Cascade Framework
* jQuery Mobile
* Mustache
* Jinja-JS
* Twig.js

## 單元測試

* Jasmine
* Mocha
* QUnit
* Unit.js

## 網頁應用有關 (MVC, MVVM)

* Angular 出自 Google
* AngularJS 出自 Google
* Backbone.js
* Cappuccino
* Chaplin.js
* Echo
* Ember.js
* Enyo
* Express.js
* Ext JS
* Google Web Toolkit
* JavaScriptMVC
* JsRender/JsViews
* Knockout
* Meteor
* Mojito
* MooTools
* Node.js
* OpenUI5 出自 SAP
* Polymer 出自 Google
* Prototype JavaScript 框架
* PureMVC
* qooxdoo
* React.js
* Rialto Toolkit
* SproutCore
* Vue.js
* Wakanda 框架

## 其他

* Modernizr
* Cannon.js
* MathJax

## 參見

* Ajax 框架
* JavaScript 框架比較

## 外部連結

* JSter，社群驅動的最有用的 javascript 庫的目錄。
* 隨時更新的 JavaScript 框架參考指南。 （頁面存檔備份，存於網際網路檔案館）
JavaScript引擎

**JavaScript 引擎**是一個專門處理 JavaScript 指令碼的虛擬機器，一般會附帶在網頁瀏覽器之中。

## 歷史

在 2008 年到 2009 年的第二次瀏覽器大戰之前，JavaScript 引擎僅簡單地被當作能閱讀執行 JavaScript 原始碼的直譯器。

* SpiderMonkey：第一個 JavaScript 引擎，由布蘭登・艾克在網景公司開發，用於 Netscape Navigator 網頁瀏覽器中，由 C++ 實作。自 JavaScript 1.5 升級以符合 ECMA-262 版本 3。
* Rhino：由網景公司的諾里斯・博伊德（Norris Boyd）開發，由 Java 實作。像 SpiderMonkey 一樣，Rhino 符合 ECMA-262 版本 3。
* Nitro：Apple Safari 4 開始支援
* V8：Google Chrome 製作
* TraceMonkey：Mozilla Firefox 3.5 開始支援

目前為止，最通用的 JavaScript 宿主環境是網頁瀏覽器。網頁瀏覽器一般使用公共的 API 建立「宿主物件」以便於在 JavaScript 中支援 DOM。

## 效能演進

一個典型的瀏覽器有一個圖形引擎和一個獨立的 JavaScript 引擎。這樣 JavaScript 引擎能夠被更方便的測試、重新生成或者在另一些專案中使用。例如：Carakan 被用在 Presto 中，Nitro 被用在 WebKit 中，SpiderMonkey 被用在 Gecko 中，KJS 被用在 KHTML 中，Rhino 預設不包含任何布局引擎。但還有其他組合，例如：V8 與 WebKit 被用於 Google Chrome 中。JavaScript 引擎能為程式設計師提供部分操作瀏覽器的功能（網路、DOM、外部事件、HTML5 影片、canvas 和儲存）。

Sunspider 是一個 JavaScript 實用基準測試通過一系列關於 JavaScript 語言的指令碼測試 JavaScript 引擎的速度。Sunspider 不測試無關於 JavaScript 的特性（不使用 HTML、CSS 和無網路情況下）。

近幾年來，在瀏覽器開發者之間展開了一場開發更快的 JavaScript 引擎的競賽。2008 年，Google Chrome 因它的 JavaScript 效能而倍受稱讚，但是其它瀏覽器馬上使用了更快的 JavaScript 引擎。之後，Google Chrome 在效能上獲得領先，其長處在於它高速的效能和 JavaScript 的處理速度，這些都由許多網站在主要的瀏覽器之間的速度測試中得到驗證。隨著 WebKit 的 Squirrelfish Extreme 和 Mozilla 的 TraceMonkey JavaScript 虛擬機器出現，Chrome 的 JavaScript 執行速度就被超越了。Google 丹麥在 Chrome 2 中開發了更快速的 V8 引擎。

2008 年 6 月 2 日，WebKit 開發團隊發布了 SquirrelFish—— 一個能極大地提升 Safari 解釋指令碼速度的新的 JavaScript 引擎。該引擎是 Safari 4 其中一個新特性，在 2008 年 6 月 11 日發布給程式設計師使用；最終此 JavaScript 引擎被稱為 Nitro。2009 年 6 月 30 日，在 Firefox 3.5 發布的最新技術能「使某些情況下的速度提升 20 到 40 倍」。

## 著名的引擎

### 開發中

* Rhino，由 Mozilla 基金會管理，開放原始碼，完全以 Java 編寫。
* SpiderMonkey，第一款 JavaScript 引擎，早期用於 Netscape Navigator，現時用於 Mozilla Firefox。
* V8，開放原始碼，由 Google 丹麥開發，是 Google Chrome 的一部分。
* JavaScriptCore，開放原始碼，用於 Safari。
* Chakra (JScript 引擎)，用於 Internet Explorer。
* Chakra (JavaScript 引擎)，用於 Microsoft Edge。
* KJS，KDE 的 ECMAScript／JavaScript 引擎，最初由哈里・波頓開發，用於 KDE 專案的 Konqueror 網頁瀏覽器中。

### 停止開發

* Linear A，用於 Opera 4.0 至 6.1 版本。
* Linear B，用於 Opera 7.0 至 9.2 版本。
* Futhark，用於 Opera 9.5 至 10.2 版本。
* Carakan，用於 Opera 10.5 至 12.1 版本。
* Nashorn，Oracle 於 JDK 1.8 發布，內嵌於 Java 的 javascript 引擎。於 Java 11 改為棄用並於 Java 15 正式移除。
* Narcissus，開放原始碼，由布蘭登・艾克編寫（他也編寫了 SpiderMonkey）。
* Tamarin，由 Adobe Labs 編寫。

## 實作

JavaScript 是一種 ECMAScript 方言，在許多程式中得以實作，特別是在網頁瀏覽器。這些方言通常擴充了語言，或者標準庫和相關 API，例如 W3C 定義的 DOM。這意味著以一種方言實作的程式不相容於另一種方言的實作，除非程式使用了方言中的公共子集所具有的特性和 API。

在實作和方言中存在著一些差別。一種語言的方言有一些與語言不同的地方。實作能夠執行該語言或方言編寫的程式。

## 參考來源

## 外部連結

* Kraken JavaScript Benchmark （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
* Peacekeeper （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
* Speed-Battle （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
* SunSpide （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
JavaScript引擎比较

下表比較在網頁瀏覽器內使用一些知名 JavaScript 引擎對標準的支援。

## 表格解說

完整列表可參見 ECMAScript 引擎列表。

### 值

這些值指示了在每個引擎中對給定專案的支援程度。預設的，預設為這個引擎的最新版本。但是，可以列出特定版本號；當這指示完全支援的時候，它是這個引擎完全支援這個專案的最初版本。

## ECMAScript 版本支援

下表中的版本號為排版引擎的版本號。JavaScript 的版本號就是 JavaScript 引擎中 SpiderMonkey 的版本號，在 ECMAScript Edition 5 之後不再延續跟進。

## 標準庫

### 全域物件

### Object 物件

### Function 物件

### Array 物件

### String 物件

### Boolean 物件

### Number 物件

### Math 物件

### Date 物件

### RegExp 物件

### Error 物件

### NativeError 物件

## 參照

## 延伸閱讀

* ECMAScript object support in Opera
* JavaScript tests & Compatibility tables （頁面存檔備份，存於網際網路檔案館）
* ECMAScript 6 compatibility table（頁面存檔備份，存於網際網路檔案館）

## 外部連結

* Webdevout （頁面存檔備份，存於網際網路檔案館） – mostly covers Windows browsers. Extensive bug testing.
JavaServer_Faces

**JavaServer Faces**（**JSF**）是一個為網路應用程式構建基於組件的使用者介面的 Java 規範，並已通過 JCP 格式化為 Java EE 的一部分。它也是一個 MVC Web 應用框架，通過在頁面中使用可重用的 UI 組件簡化了基於伺服器的應用程式的使用者介面（UI）。

## 版本

* JSF 2.3 (2017-03-28) — Major features: search Expressions, extensionless URLs, bean validation for complete classes, push communication using WebSocket, enhanced integration with CDI.
* JSF 2.2 (2013-04-16) — JSF 2.2 introduced new concepts like stateless views, page flow and the ability to create portable resource contracts.
* JSF 2.1 (2010-10-22) — Maintenance release of 2.0. Only very minor amount of spec changes.
* JSF 2.0 (2009-06-28) — Major release for ease of use, enhanced functionality, and performance. Coincides with Java EE 6.
* JSF 1.2 (2006-05-11) — 核心系統和 API 改進. Coincides with Java EE 5. Initial adoption into Java EE.
* JSF 1.1 (2004-05-27) — 錯誤修復，沒有更改規範.
* JSF 1.0 (2004-03-11) — 初始規範發布.

## 技術的主要組件

為了展現 UI 組件和管理它們的狀態；操作事件、伺服器端的確認和資料變換；定義頁面導航；支援國際化和可存取性；提供對所有特性的可延伸性的 API 為了在 JSP 中表示 UI 組件和拍發組件給伺服器端物件的兩個 JSP 自訂 tag 庫。

## JavaServer Faces 技術好處

引入了基於組件和事件驅動的開發模式，使開發人員可以使用類似於處理傳統介面的方式來開發 Web 應用程式。提供了行為與表達的清晰分離。
不用特別的手稿語言或者標記式語言來連接 UI 組件和 Web 層。JSF 技術 API 被直接分層在 Servlet API 的頂端。
技術為管理組件狀態提供一個豐富的體系機構、處理組件資料、確認使用者輸入和操作事件。

## JavaServer Faces 應用程式

典型的 JSF 應用程式包含下列部分：

　
: * 一組 JSP 頁面
* 一組後台 bean（為在一個頁面上的 UI 組件定義的屬性和函式的 JavaBean 組件）
* 應用程式組態資原始檔（定義頁面導航規則、組態 bean 和其它的自訂物件，如自訂組件）
* 部署描述檔案（web.xml）
* 一組由應用程式開發者建立的自訂物件（有可能）
* 一些可能包含自訂組件、約束、轉換器或者監聽器的物件
* 為在頁面中表現自訂物件的一組自訂 tag

包含 JSP 頁面的 JSF 應用程式也使用由為了表現 UI 組件和在頁面上的其他物件的 JSF 技術而定義的標準的 tag 庫。

## JavaServer Faces 應用程式開發角色

* 頁面作者：使用 JSF 標記庫建立頁面。
* 應用程式開發者：編寫自訂轉換器、約束、監聽器和後台 bean。
* 組件作者：建立自訂 UI 組件和實施者（renderer）。
* 應用程式建造者：組態應用程式，包括定義導航規則、組態自訂物件和建立部署描述檔案。

## 參見

* J2EE
* Struts

## 參考資料

## 外部連結

* Brief review （頁面存檔備份，存於網際網路檔案館） on the latest changes to JSF 2.0 to be reflected in Java EE 6
* Cloud Tutorial - JavaServer Faces in a Day JSF Tutorial that embraces the use of a Cloud IDE to let you learn the fundamentals of JSF in just one day
* Core Servlets JSF Tutorials （頁面存檔備份，存於網際網路檔案館） Tutorials with Source Code
* ICEfaces （頁面存檔備份，存於網際網路檔案館） Official site of the ICEfaces Open Source Project
* James Holmes' JSF Resources （頁面存檔備份，存於網際網路檔案館） Extensive listing of JSF articles, blog entries, tutorials, and more
* Java EE 4 Tutorial （頁面存檔備份，存於網際網路檔案館） Chapter 17: JavaServer Faces Technology （頁面存檔備份，存於網際網路檔案館）
* Java EE 5 Tutorial （頁面存檔備份，存於網際網路檔案館） Chapter 10: JavaServer Faces Technology （頁面存檔備份，存於網際網路檔案館）
* Java EE 6 Tutorial （頁面存檔備份，存於網際網路檔案館） Chapter 4: JavaServer Faces Technology （頁面存檔備份，存於網際網路檔案館）
* Java EE 7 Tutorial Chapter 7: JavaServer Faces Technology （頁面存檔備份，存於網際網路檔案館）
* JSF Central （頁面存檔備份，存於網際網路檔案館） JavaServer Faces Community
* JSF Matrix listing various JSF implementations and their features
* JSF Tutorial Sitenol （頁面存檔備份，存於網際網路檔案館） JSF tutorials, examples and good email support for coding problems
* JSF Tutorials Memorynotfound JSF tutorials, Code Examples, Best Practices
* JSF Tutorials, Examples and Articles catalog
* JSR 276 （頁面存檔備份，存於網際網路檔案館） Design-Time Metadata for JavaServer Faces Components
* 官方網站 JSF 在 java.net 上的計畫頁面
* PrimeFaces （頁面存檔備份，存於網際網路檔案館） Official site PrimeFaces
JavaStation

**JavaStation**[1]是一種網路電腦（Network Computer，NC），由昇陽電腦於 1996 年－1998 年間所研發。

JavaStation 的硬體是以昇陽電腦過往的 SPARCstation 工作站為基礎而設計，SPARCstation 工作站及其架構過去在 UNIX 工作站領域中相當成功。不過，JavaStation 缺乏硬碟機、軟碟機、光碟機，同時也有許多地方與 SPARC 電腦不同，如使用標準的 IBM PS/2 週邊介面及 VGA 視訊介面。

1. **^** - 過去的中文相關報導有時翻譯成：爪哇工作站。

## 有關 JavaStation 的小風趣

以下有幾個關於 JavaStation 的小風趣：

* JavaStation-1 也稱為「Mr. Coffee」咖啡先生
* JavaStation-NC 也稱為「Mr. Krups」Krups 先生，Krups 是一個咖啡壺的品牌
* JavaStation-E 也稱為「Espresso」濃咖啡
* JavaEngine-1 也稱為「JE-1」（縮寫）
* The "Dover" JavaStation（Dover，英國東南部的港口）
* The Generation 3 "Super JavaStation" 第三代的「超級 JavaStation」（其實只有兩款 JavaStation，沒有到第三款、第三代過）
* The Pre-Mr. Coffee JavaStation Prototype 預咖啡先生 JavaStation 原型品（雛形品）
* The JavaStation "Fox".

## 作業系統

JavaStation 所採行的作業系統是 JavaOS，並以快閃記憶體的型態存放在機內，不過也可以改安裝 Linux 或 NetBSD。

## 外部連結

* JavaStation Linux HOWTO （頁面存檔備份，存於網際網路檔案館）
JavaWorld

**國際數據集團**（英語：International Data Group），簡稱 **IDG**，為一家位於美國波士頓的媒體信息技術出版與風險投資公司，創建於 1964 年。

## 在中國風險投資案例

* 百度，2000 年 9 月，百度第二輪融資時 IDG 投入 150 萬美元，占 5% 股權
* 騰訊，1999 年，IDG 投入 100 萬美金占股 20%
* 3721
* 攜程、如家酒店、華住酒店集團（原漢庭酒店集團）
* 金融界
* 搜房
* 嗶哩嗶哩，2013 年 10 年，獲得 IDG 數百萬美元投資
* 迅雷
* 360

## 台灣

* 大石國際文化（出版業，發行國家地理雜誌繁體中文版）

## 參看

* 熊曉鴿
* 王功權

## 參考文獻

## 外部連結

* 官方網站
* IDG 資本（頁面存檔備份，存於網際網路檔案館）
* IDG 中國（頁面存檔備份，存於網際網路檔案館）
* 大石國際文化
Java_5.0

**Java** 從 **5.0** 版本開始，加入許多新特性，是 Java 歷史中修改最大的版本，許多特點模仿自 C#，因而被認為是為了與 C# 對抗。

## 新的特性

### 自動裝箱／拆箱（Auto-Boxing/Unboxing）

將 Java 中 8 個基本類型實現自動物件化和值化轉換，通過編譯器自動完成相關轉換程式碼的生成。

沒有自動裝箱／拆箱：

有自動裝箱／拆箱：

實際上將相關位元組碼反編譯後，會還原出其隱式呼叫的轉換方法：

自動裝箱的新功能，可能是從 C# 語言身上學習來的，Java 已經越來越像 C#。然而 Java 對自動裝箱／拆箱的支援，僅是利用編譯器實現，在 Java Bytecode 中，並無自動裝箱／拆箱的操作碼（opcode）。

### 泛型（Generic Types）

泛型就像是 C++ 的模板。原有的 Collection API 加上泛型支援後，增加對型別的檢查，減少程式錯誤的機會。

沒有泛型：

使用 Generic：

### 註解（Annotation）

Annotation 全名是 Program Annotation Facility，是 Java SE 5.0 的新功能。Java 的 Annotation 類似於.NET 的屬性（Attribute）。Java 的註解是一種介面（interface），繼承自 java.lang.annotation.Annotation。Class File 則貼上 ACC\_ANNOTATION 標籤。

從 5.0 開始，javadoc 的 `@deprecated`（代表不建議使用的方法或類別）也被 Annotation 中的 `@Deprecated` 取代；另外，使用 Java 實作 SOP 的 AspectJ 與 Spring 也使用了大量的 Annotation。

### 列舉類型（enum）

列舉類型也是 J2SE 5.0 的新功能。過去 Java 認為 enum 的關鍵字是不必要的功能，因為用 public static int field 就可以取代 enum，因此過去一直不用。J2SE 5.0 中的 class 如果是 enum，在 class file 中會被貼上一個 ACC\_ENUM 標籤。

Enum 一般用來表示一組相同類型的常數。如性別、日期、月份、顏色等。對這些屬性用常數的好處是顯而易見的，不僅可以保證單例，且比較時候可以用 「==」 來替換 equals 。是一種好的習慣。 JDK1.5 之前沒有 Enum 這個類型，那時候一般用介面常數來替代。Java 有了 Enum 之後，可以更貼近的表示這種常數。

 

 

### 國際化

Java 語言嚴格區分位元組和字元。字元的儲存格式為 UCS-2，也就是只能使用位於基本多文種平面的字元，從 Java 5 開始支援 UTF-16 字元。

另外，從 5.0 開始 Java 的程式也開始可以使用 Unicode 字元進行命名。

下面就是一個合法的 Java 程式，裡面包含了中文字元作為字串的名稱，這個程式可以在編譯器中通過編譯。

 

### 輸入輸出

在 jdk1.5 及其以後版本中，`java.util.Scanner` 和 `java.util.Formatter` 類別被應用到輸入輸出中。另外，也出現了類似 C 語言的 `printf()` 函式。

### foreach 迴圈

foreach 迴圈，有時又稱 forin 迴圈，在許多程式語言（包括 C#、Ruby、JavaScript）中都有出現，可以直接將一個 Array 或 Map 展開，而不必由程式設計師自行檢查邊界，可以有效減少錯誤的機會。

### 可變長度的引數

長久以來一直有使用者要求加入 `printf()` 函式，受限於 Java 函式必須要有固定引數的限制，始終無法實現，在加入這個功能之後，連帶 `printf()` 也變為可能。

### static 引入

這個特性允許程式設計師將一個類別中的靜態內容引入到程式中。

## 批評

Java 5.0 雖然加入許多的新特性，但為了與舊版本相容，JVM 並沒有隨之改變，而僅只是從編譯器動手腳，因而引發許多問題。討論 Java 語言問題的專書《Java Puzzle》就有專門的篇幅討論 5.0 之後造成的問題。

### 自動裝箱／拆箱的矛盾

自動裝箱這功能也造成了一些矛盾，例如：

### 泛型擦除

和 C#，C++ 的泛型不同，Java 的泛型只用在型別檢查，使用的時候還要再做一次轉型和型別檢查。泛型資訊在編譯時會從程式碼中抹除（只保留作為元資料給反射功能獲得），泛型對應的值類型在位元組碼中為 java.lang.Object 類型，這是為了降低 JVM 的修改難度和保證老舊程式碼的執行相容。

## 注釋
Java_Anon_Proxy

**Java Anon Proxy** 縮寫 **JAP**，旨在協助匿名使用網際網路，首頁上的口號是「匿名 & 隱私 - 匿名無罪」。通過將連接逐級加密，來隱藏原始連接。JAP 是自由開源軟體，採用 Java 製作所以自然跨平台，能自動尋找伺服器。

最初是德國德勒斯登工業大學、雷根斯堡大學以及什勒斯維希 - 霍爾斯坦州隱私委員會的研究專案，現在仍然主要在德國開發。

## 歷史

起初 JAP 是閉源軟體。2003 年，有人發現德國刑警在 JAP 中安裝資訊審查系統，新聞披露後引起很大轟動，導致了使用者的不信任，JAP 也受到指責。所以接下來 JAP 開放了原始碼，清除審查後門，希望贏得使用者信任。

2005 年 5 月，JAP 宣布可以接入 Tor 網路，2006 年宣布可以接入 Mixminion。

## 評價

* 大學支援使網路頻寬比其他保密代理多不少
* 通過多層代理加密防止從一點突破來保證高安全性
* 伺服器中央集中，偶爾掉線時網速會受很大影響
* 可做客戶端接入 Tor 網路來獲得更高匿名性

## 參見

* 突破網路審查
* 防火長城

## 參考資料

## 外部連結

* JAP 官方網站 （頁面存檔備份，存於網際網路檔案館）
Java_Applet

**Applet** 或 **Java 小應用程式**是一種在 Web 環境下，執行於客戶端的 Java 程式組件。它也是 1990 年代中期，Java 在誕生後得以一炮走紅的功臣之一。通常，每個 Applet 的功能都比較單一（例如僅用於顯示一個舞動的 Logo），因此它被稱作「小應用程式」1。JDK 9 以後不再支援。

Applet 必須執行於某個特定的「容器」，這個容器可以是瀏覽器本身，也可以是通過各種外掛程式，或者包括支援 Applet 的行動裝置在內的其他各種程式來執行。與一般的 Java 應用程式不同，Applet 不是通過 main 方法來執行的（參見 Java 的 Hello World 程式和 Java Applet 的 Hello World 程式）。在執行時 Applet 通常會與使用者進行互動，顯示動態的畫面，並且還會遵循嚴格的安全檢查，阻止潛在的不安全因素（例如根據安全策略，限制 Applet 對客戶端檔案系統的存取）。

2016 年，甲骨文公司宣布 Applet 只保留至 JDK 8，JDK 9 以後的版本不再支援，因為 2013 年開始主流的瀏覽器考量安全穩定因素，漸漸不支援外掛程式如 Applet。大部分瀏覽器 2021 年已完全不支援外掛程式。

## 應用範例

* 以 AWT 方式撰寫一個顯示「Hello, world!」的 Java applet。

* 上述 Java 的 Code 編譯成 HelloWorld.class，再透過下述網頁使用。

## 注釋

1. Applet 是由英語「應用程式」_Application_ 的縮寫 **App** 和代表「小」的字尾 **let** 組成。Servlet（**Serv**er-let）、MIDlet（**M**obile **I**nformation **D**evice-let）和 JSP 中的 Scriptlet 的命名也是基於同樣原理。

## 參見

* ActiveX
* Curl
* Java
* Java Servlet
* Java Web Start
* JavaFX
* 多樣化網際網路應用程式
* WebGL
Java_Card

**Java Card** 技術主要是讓智慧卡或與智慧卡相近的裝置上，以具有安全防護性的方式來執行小型的 Java Applet，此技術也被廣泛運用在 SIM 卡、提款卡上。

第一個運用 Java Card 技術的智慧卡是在 1997 年發表，由數家公司所共同採行，包括過去 Schlumberger 公司的卡片部門（今日為 Axlto 公司）與 Gemplus 公司。Java Card 的產品皆以 Java Card Platform specifications（爪哇卡平台規格）為依循標準，此技術規格標準由昇陽電腦所研發。整體而言，Java Card 的主要特點及訴求在於移攜性與安全性。

## 程式移攜性

Java Card 虛擬機（Java Card Virtual Machine，也可簡稱為 Java Card VM 或 JCVM）它是原有 Java 虛擬機的子集合，負責對 Java Applet 進行程式直譯、執行及結果回應，也因此 JCVM 的空間佔量不能太大，必須能小到放入智慧卡內。此外，Java Card 的 Java Applet 也必須比一般 Java Applet 更小型，要求 JCVM 與 Java Card Applet 都更小化，對日後的進一步撰寫開發與程式移植等有幫助。

既然有容量取向的要求，那也就必須對 Java 的功效機能進行部分權衡取捨，即便可以用多種方式讓應用程式的體積佔量突破容量限制，例如將應用程式的程式碼劃分到 Package（Java 程式語言中，用來將類以性質、用途等不同取向等而集中放置的地方，即稱為 Package）內，但是每個 Package 也被限制不能超過 64KB 的容量。

## 防護安全性

Java Card 技術在研發初衷就是為了保護智慧卡內的私密、敏感性資料。

由於 Java Card 的應用程式是在 Java Card VM 具隔離性的環境下執行，所以程式對卡片資料的寫入、讀取、修改也受到權限機制的控制保護，無論使用何種讀卡裝置、作業系統、應用程式都不能跨越權限去存取不屬於自己的卡片內資料，等於具有小型應用程式的防火牆的功效。
Java Card 能支援絕大多數的常用加密演算法，包括橢圓曲線加密法。

無論是電信方面還是金融方面的智慧型片應用，現在都運用 Java Card 技術來防護卡內所儲存的資訊資料。

## 相關條目

* 爪哇卡開放平台（Java Card OpenPlatform，簡稱：JCOP），是一個以 Java Card 為基礎的作業系統，且因使用 Java Card 技術而具有安全防護性。

## 外部連結

* （英文）Java Card 平台規格（昇陽電腦） （頁面存檔備份，存於網際網路檔案館）
Java_Classloader

**Java 類別載入器**（英語：Java Classloader）是 Java 執行時環境（Java Runtime Environment）的一個部件，負責動態載入 Java 類別到 Java 虛擬機器的記憶體空間中。類別通常是按需載入，即第一次使用該類別時才載入。由於有了類別載入器，Java 執行時系統不需要知道檔案與檔案系統。對學習類別載入器而言，掌握 Java 的委派概念是很重要的。

每個 Java 類別必須由某個類別載入器裝入到記憶體。Java 程式可以通過類別載入器來利用外部庫（即由其他作者編寫的軟體庫）。

JVM 中有 3 個預設的類別載入器：

1. 引導（Bootstrap）類別載入器。由原生代碼（如 C 語言）編寫，不繼承自 `java.lang.ClassLoader`。負責載入核心 Java 庫，儲存在 `<JAVA_HOME>/jre/lib` 目錄中。
2. 擴充（Extensions）類別載入器。用來在 `<JAVA_HOME>/jre/lib/ext`, 或 `java.ext.dirs` 中指明的目錄中載入 Java 的擴充庫。Java 虛擬機器的實現會提供一個擴充庫目錄。該類別載入器在此目錄裡面尋找並載入 Java 類別。該類別由 `sun.misc.Launcher$ExtClassLoader` 實現。
3. Apps 類別載入器（也稱系統類別載入器）。根據 Java 應用程式的類別路徑（`java.class.path` 或 CLASSPATH 環境變數）來載入 Java 類別。一般來說，Java 應用的類別都是由它來完成載入的。可以通過 ClassLoader.getSystemClassLoader () 來取得它。該類別由 `sun.misc.Launcher$AppClassLoader` 實現。

每個類別裝載器通過組合的方式包含一個父裝載器（parent class loader）。

JDK 1.2 之後引入「雙親委派」方式來實現類別載入器的層次呼叫，以儘可能保證 JDK 的系統 API 不會被使用者定義的類別載入器所破壞，但一些使用場景會打破這個慣例來實現必要的功能。

## 自訂類別載入器

開發可以通過繼承 `java.lang.ClassLoader` 類別的方式實現自己的類別載入器，以滿足一些特殊的需求而不需要完全了解 Java 虛擬機器的類別載入的細節。

可用於：

* 執行時裝載或解除安裝類別。這常用於：
  * 實現手稿語言
  * 用於 bean 生成器
  * 允許使用者定義的擴充性
  * 允許命名空間之間的通信。這是 CORBA / RMI 協定的基礎。
* 改變 Java 位元組碼的裝入，例如：可用於 Java 類別位元組碼的加密裝入。
* 修改已裝入的位元組碼（weaving of aspects when using aspect-oriented programming）。

## JEE 的類別裝載

Java EE （JEE）應用程式伺服器典型地用樹狀的一組類別裝載器從已部署的 WAR 或 EAR 文件中裝入類別。這使得應用程式之間彼此隔離，但共享已部署模組。servlet container 一般被實現為多個類別裝載器。

##  JAR 地獄

和 DLL 地獄一樣，一個組件的特定 JAR 也存在版本差異，不同版本間的 JAR 檔案的 Class 檔案存在差異（包括 Class 檔案的編譯版本、Class 的成員結構、Class 繼承關係等）的話，也會在執行時觸發各種因為類別檔案結果衝突而導致的錯誤警告。對於 Servlet 容器，還存在容器所需的 JAR 與應用內所需的 JAR 雙線衝突的問題。

不同於 DLL 地獄，Java 開發者會使用一些專案管理程式（例如 Apache Maven）來解決 JAR 版本之間的衝突，通過組態依賴關係檔案，設定不同組件的 JAR 版本依賴關係，由專案管理程式自動載入相應合適的 JAR，來控制 JAR 間 的版本關係。而對於 Servlet 容器，也會通過自己實現類別載入器打破 JDK 的「雙親委派」方式來避免 JAR 載入衝突。

## 參考文獻

## 外部連結

* Chuck McManis, "The basics of Java class loaders", 1996
* Brandon E. Taylor, "Java Class Loading: The Basics （頁面存檔備份，存於網際網路檔案館）", 2003
* Jeff Hanson, "Take Control of Class Loading in Java （頁面存檔備份，存於網際網路檔案館）", 2006-06-01
* Andreas Schaefer, "Inside Class Loaders （頁面存檔備份，存於網際網路檔案館）", 2003-11-12
* Sheng Liang and Gilad Bracha, "Dynamic class loading in the Java virtual machine（頁面存檔備份，存於網際網路檔案館）", In Proceedings of the 13th ACM Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA'98), ACM SIGPLAN Notices, vol. 33, no. 10, ACM Press, 1998, pp. 36–44
* Dr. Christoph G. Jung, "Classloaders Revisited Hotdeploy （頁面存檔備份，存於網際網路檔案館）", _Java Specialist Newsletter_, 2001-06-07
* Don Schwarz, "Managing Component Dependencies Using ClassLoaders （頁面存檔備份，存於網際網路檔案館）", 2005-04-13
Java_Community_Process

**JCP**（**Java Community Process**）成立於 1998 年，是使有興趣的各方參與定義 Java 的特徵和未來版本的正式過程。

JCP 使用 **JSR**（Java 規範請求，_Java Specification Requests_）作為正式規範文檔，描述被提議加入到 Java 體系中的的規範和技術。

JSR 變為 _final_ 狀態前需要正式的公開審查，並由 JCP Executive Committee 投票決定。最終的 JSR 會提供一個參考實現，它是免費而且公開原始碼的；還有一個驗證是否符合 API 規範的 _Technology Compatibility Kit_。

## JSR 列表

目前已經有超過 300 個 JSR，常見的 JSR 有：

## 參考文獻

## 外部連結

* JCP （頁面存檔備份，存於網際網路檔案館）
* 已經完成的 JSR （頁面存檔備份，存於網際網路檔案館）
Java_Database_Connectivity

**Java 資料庫連接**，（**Java Database Connectivity**，簡稱 **JDBC**）是 Java 語言中用來規範客戶端程式如何來存取資料庫的應用程式介面，提供了諸如查詢和更新資料庫中資料的方法。JDBC 也是 Sun Microsystems 的商標。JDBC 是面向關係型資料庫的。

在 J2SE 中，提供了一個稱之為 JDBC-ODBC 橋（JDBC-ODBC Bridge）的 API。通過 ODBC，JDBC-ODBC 橋驅動程式可以存取所有支援 ODBC 的關係型資料庫。與 JDBC API 不同的是，這個驅動程式並不是由 Java 程式碼而是由機器碼（machine code）編寫，並且不是開放原始碼的。

## 驅動程式類型

JDBC 驅動程式共分四種類型：

### 類型 1：JDBC-ODBC 橋

這種類型的驅動把所有 JDBC 的呼叫傳遞給 ODBC，再讓後者呼叫資料庫本地驅動程式碼（也就是資料庫廠商提供的資料庫操作二進位程式碼庫，例如 Oracle 中的 oci.dll）。

優點：

* 只要有對應的 ODBC 驅動（大部分資料庫廠商都會提供），幾乎可以存取所有的資料庫。

缺點：

* 執行效率比較低，不適合大數據量存取的應用；
* 由於需要客戶端預裝對應的 ODBC 驅動，不適合 Internet/Intranet 應用。

### 類型 2：本地 API 驅動

這種類型的驅動通過客戶端載入資料庫廠商提供的本地程式碼庫（C／C++ 等）來存取資料庫，而在驅動程式中則包含了 Java 程式碼。

優點：

* 速度快於第一類驅動（但仍比不上第 3、第 4 類驅動）。

缺點

* 由於需要客戶端預裝對應的資料庫廠商程式碼庫，仍不適合 Internet/Intranet 應用。

### 類型 3：網路協定驅動

這種類型的驅動給客戶端提供了一個網路 API，客戶端上的 JDBC 驅動程式使用通訊端（Socket）來呼叫伺服器上的中介軟體程式，後者在將其請求轉化為所需的具體 API 呼叫。

優點：

* 不需要在客戶端載入資料庫廠商提供的程式碼庫，單個驅動程式可以對多個資料庫進行存取，可延伸性較好。

缺點：

* 在中介軟體層仍需對最終資料進行組態；
* 由於多出一個中介軟體層，速度不如第四類驅動程式。

### 類型 4：本地協定驅動

這種類型的驅動使用 Socket，直接在客戶端和資料庫間通信。

優點：

* 存取速度最快；
* 這是最直接、最純粹的 Java 實現。

缺點：

* 幾乎只有資料庫廠商自己才能提供這種類型的 JDBC 驅動。
* 需要針對不同的資料庫使用不同的驅動程式。

## API 概述

_參看 Java SE 以及 java.sql API_

JDBC API 主要位於 JDK 中的 java.sql 包中（之後擴充的內容位於 javax.sql 包中），主要包括（斜體代表介面，需驅動程式提供者來具體實現）：

* DriverManager：負責載入各種不同驅動程式（Driver），並根據不同的請求，向呼叫者返回相應的資料庫連接（Connection）。
* _Driver_：驅動程式，會將自身載入到 DriverManager 中去，並處理相應的請求並返回相應的資料庫連接（Connection）。
* _Connection_：資料庫連接，負責進行與資料庫間的通訊，SQL 執行以及事務處理都是在某個特定 Connection 環境中進行的。可以產生用以執行 SQL 的 Statement。
* _Statement_：用以執行 SQL 查詢和更新（針對靜態 SQL 語句和單次執行）。
* _PreparedStatement_：用以執行包含動態參數的 SQL 查詢和更新（在伺服器端編譯，允許重複執行以提高效率）。
* _CallableStatement_：用以呼叫資料庫中的儲存程序。
* SQLException：代表在資料庫連接的建立和關閉和 SQL 語句的執行過程中發生了例外情況（即錯誤）。

### 資料類型的對映

註：這種類型匹配不是強制性標準，特定的 JDBC 廠商可能會改變這種類型匹配。例如 Oracle 中的 DATE 類型是包含時分秒，而 java.sql.Date 僅僅支援年月日。

## 例子

利用 Class.forName () 方法來載入 JDBC 驅動程式（_Driver_）至 DriverManager：

然後，從 DriverManager 中，通過 JDBC URL，使用者名稱，密碼來獲取相應的資料庫連接（_Connection_）：

不同的 JDBC 驅動程式的 URL 是不同的，它永遠以「jdbc：」開始，但後面的內容依照驅動程式類型不同而各異。在獲取 _Connection_ 之後，便可以建立 _Statement_ 用以執行 SQL 語句。下面是一個插入（INSERT）的例子：

查詢（SELECT）的結果存放於結果集（_ResultSet_）中，可以按照順序依次存取：

但是，通常，Java 程式設計師們更傾向於使用 _PreparedStatement_。下面的例子使用上例中的 conn 物件：

如果資料庫操作失敗，JDBC 將丟擲一個 SQLException。一般來說，此類異常很少能夠恢復，唯一能做的就是盡可能詳細的列印異常日記。推薦的做法是將 SQLException 翻譯成應用程式領域相關的異常（非強制處理異常）並最終回滾資料庫和通知使用者。

一個資料庫事務代碼如下：

## 參考文獻

## 外部連結

* Sun 提供的 JDBC 驅動程式及其供應商列表
* Sun 提供的教程
* Sun Java 2 1.4.2 API （頁面存檔備份，存於網際網路檔案館）
* 一個訂單系統的原形 （頁面存檔備份，存於網際網路檔案館）
* DBAccessor: JDBC 資料庫存取封裝類 （頁面存檔備份，存於網際網路檔案館）
* 開源的 JDBC 驅動程式列表 （頁面存檔備份，存於網際網路檔案館）
* http://blog.csdn.net/cho3en1/article/details/52695808 （頁面存檔備份，存於網際網路檔案館）

## 參見

* 資料庫
* Java
* J2SE
* J2EE
* ODBC
* ADO
* ADO.NET
Java_Desktop_System

**Sun Java Desktop System**（**JDS**）是一個用於昇陽的 Solaris 及其原來 Linux（Linux 的支援於 2006 年 5 月 30 日中斷） 的桌面環境。

JDS 目的為提供一般電腦使用者一個熟悉（意即其外觀與 Microsoft Windows 相似）以及擁有一整套如辦公軟體套裝、網頁瀏覽器、電子郵件、日程表與即時訊息等辦公室生產力軟體的系統。

其名稱反映出昇陽有意將其作為一個推動公司使用者部署為 Java 平台編寫的軟體的場所；JDS 建基於 GNOME 之上，主要採用自由軟體。

## 版本

JDS 3 包含在 Solaris 10 內 —— 在安裝 Solaris 時可選擇使用 CDE 或 JDS。JDS Release 2 亦可在其中一個基於 SuSE 的 Linux 分發版上使用。

JDS 第二版包括

* Java
* GNOME（使用 Blueprint 佈景主題）
* StarOffice
* Mozilla
* Evolution
* MP3 與光碟播放器
* Java Media Framework 的 Java Media Player
* Gaim 多個服務即時通訊軟體
* RealPlayer

JDS Release 3 基於 GNOME 2.6，只有 Solaris 10 平台可使用，已被甲骨文併購的昇陽先前曾在內部的 Solaris 10 桌面電腦上佈署 JDS 3。

OpenSolaris 使用的 JDS 常稱作 OpenSolaris Desktop。OpenSolaris Desktop 01（於 2005 年 10 月 28 日發佈）基於 GNOME 2.10，OpenSolaris Desktop 02（於 2005 年 12 月 23 日）基於 GNOME 2.12。

最初時昇陽為 Solaris 8 同梱了一張 GNOME 1.4 的預覽版獨立光碟。

## 註解

## 請參閱

* Project Looking Glass

## 外部連結

* Sun Java Desktop System
* Java.net 上的 Java Desktop 社群
* OpenSolaris 上的 Java Desktop System 社群
* OS News 的評論 （頁面存檔備份，存於網際網路檔案館）－2003 年 12 月
* eWeek 的評論－2003 年 12 月
Java_Development_Kit

**Java Development Kit**（**JDK**）是昇陽電腦針對 Java 開發人員發布的免費軟體開發套件（SDK，Software development kit）。自從 Java 推出以來，JDK 已經成為使用最廣泛的 Java SDK。由於 JDK 的一部分特性採用商業許可證，而非開源。因此，2006 年昇陽電腦宣布將發布基於 GPL 的開源 JDK，使 JDK 成為自由軟體。在去掉了少量閉源特性之後，昇陽電腦最終促成了 GPL 的 OpenJDK 的發布。

## 用途

作為 Java 語言的 SDK，普通使用者並不需要安裝 JDK 來執行 Java 程式，而只需要安裝 JRE（Java Runtime Environment）。而程式開發者必須安裝 JDK 來編譯、除錯程式。

## 包含組件

JDK 包含了一批用於 Java 開發的組件，其中包括：

* javac：編譯器，將字尾名為.java 的原始碼編譯成字尾名為「.class」的位元組碼
* java：執行工具，執行.class 的位元組碼
* jar：打包工具，將相關的類檔案打包成一個檔案
* javadoc：文件生成器，從原始碼注釋中提取文件，注釋需符合規範
* jdb debugger：除錯工具
* jps：顯示當前 java 程式執行的行程狀態
* javap：反編譯程式
* appletviewer：執行和除錯 applet 程式的工具，不需要使用瀏覽器
* javah：從 Java 類別生成 C 標頭檔和 C 原始檔。這些檔案提供了連接膠合，使 Java 和 C 代碼可進行互動。
* javaws：執行 JNLP 程式
* extcheck：一個檢測 jar 包衝突的工具
* apt：注釋處理工具
* jhat：java 堆分析工具
* jstack：棧跟蹤程式
* jstat：JVM 檢測統計工具
* jstatd：jstat 守護行程
* jinfo：取得正在執行或崩潰的 java 程式組態資訊
* jmap：取得 java 行程記憶體對映資訊
* idlj：IDL-to-Java 編譯器。將 IDL 語言轉化為 java 檔案
* policytool：一個 GUI 的策略檔案建立和管理工具
* jrunscript：命令列指令碼執行

JDK 中還包括完整的 JRE（Java Runtime Environment），Java 執行環境，也被稱為 _private_ runtime。包括了用於產品環境的各種庫類，如基礎類別館 rt.jar，以及給開發人員使用的補充庫，如國際化與在地化的類別館、IDL 庫等等。

JDK 中還包括各種樣常式序，用以展示 Java API 中的各部分。

## 系統需求

無論 Linux、Windows 或者 Mac OS 系統，JDK 均有 X86 與 X64 甚至安騰架構的發行版本。且均為多語言發行，即根據系統語言的不同自動顯示不同語言的資訊。

## 版本

自 JDK 5.0 起，Java 以兩種方式發布更新：

* Limited Update 包含新功能和非安全修正，版本號是 20 的倍數
* Critical Patch Updates（CPUs）只包含安全修正，版本號將是上一個 Limited Update 版本號加上五的倍數後的奇數。

Java SE 7 Update 71 之後則以雙版本發布：

* 重要補丁更新（Critical Patch Update）
* 補丁集更新（Patch Set Update）

Oracle 建議只有在當次 PSU 版有修正使用者遇到的特定問題時才安裝該 PSU 版。

## 參見

* 軟體開發套件 (SDK)

## 參考文獻

## 外部連結

* New to Java Programming Center （頁面存檔備份，存於網際網路檔案館）（英文）
* OpenJDK（頁面存檔備份，存於網際網路檔案館）（英文）
* Java SE Downloads （頁面存檔備份，存於網際網路檔案館）（英文）
Java_EE

**Java EE**，Java 平台企業版（Java Platform Enterprise Edition），之前稱為 Java 2 Platform, Enterprise Edition (J2EE)，2018 年 3 月更名為 **Jakarta EE**。是 Sun 公司為企業級應用推出的標準平台。Java 平台共分為三個主要版本 **Java EE**、Java SE 和 Java ME。

Sun 公司在 1998 年發表 JDK1.2 版本的時候，使用了新名稱 Java 2 Platform，即「Java2 平台」，修改後的 JDK 稱為 Java 2 Platform Software Developing Kit，即 J2SDK。並分為標準版（Standard Edition，J2SE），企業版（Enterprise Edition，J2EE），微型版（MicroEdition，J2ME）。J2EE 便由此誕生。

2005 年 6 月，JavaOne 大會召開，SUN 公司公開 Java SE 6。此時，Java 的各種版本已經更名以取消其中的數字「2」：J2EE 更名為 Java EE, J2SE 更名為 Java SE，J2ME 更名為 Java ME。

隨著 Java 技術的發展，J2EE 平台得到了迅速的發展，成為 Java 語言中最活躍的體系之一。現如今，J2EE 不僅僅是指一種標準平台，它更多的表達著一種軟體架構和設計思想。

## 組件

Java EE 是一系列技術標準所組成的平台，包括：

* EJB - 企業級 JavaBean（Enterprise Java Beans）
* JAAS - Java Authentication and Authorization Service
* JACC - J2EE Authorization Contract for Containers
* JAF - Java Beans Activation Framework
* JAX-RPC - Java API for XML-Based Remote Procedure Calls
* JAX-WS - Java API for XML Web Services
* JAXM - Java API for XML Messaging
* JAXP - Java XML 解析 API（Java API for XML Processing）
* JAXR - Java API for XML Registries
* JCA - J2EE 連接器架構（J2EE Connector Architecture）
* JDBC - Java 資料庫聯接（Java Database Connectivity）
* JMS - Java 訊息服務（Java Message Service）
* JMX - Java Management
* JNDI - Java 名稱與目錄介面（Java Naming and Directory Interface）
* JSF - Java Server Faces
* JSP - Java 伺服器頁面（Java Server Pages）
* JSTL - Java 伺服器頁面標準標籤庫（Java Server Pages Standard Tag Library）
* JTA - Java 事務 API（Java Transaction API）
* JavaMail
* Servlet - Java Servlet API
* StAX - Streaming APIs for XML Parsers
* WS - Web Services
* Applet - Java Applet

## 版本歷史

* J2EE 1.2 (1999 年 12 月 12 日)
* J2EE 1.3 (2001 年 9 月 24 日)
* J2EE 1.4 (2003 年 11 月 11 日)
* Java EE 5 (2006 年 5 月 11 日)
* Java EE 6 (2009 年 12 月 10 日)
* Java EE 7 (2013 年 5 月 28 日)
* Java EE 8 (2017 年 8 月 31 日)

## 參見

* Web 容器
* 部署描述符
* Java BluePrints
* Sun Java System Portal Server
* Java EE version history
* Sun Community Source License
* Java Research License

## 參考文獻

## 外部連結

* Oracle Technology Network's Java EE（頁面存檔備份，存於網際網路檔案館）
* Oracle's Java EE Compatibility page （頁面存檔備份，存於網際網路檔案館） - Certified Java EE Compatible Implementations
* Core J2EE Patterns（頁面存檔備份，存於網際網路檔案館）
* A short tutorial introducing beginning Java EE developers to the Java EE platform （頁面存檔備份，存於網際網路檔案館）
* Cloud Tutorial - Java EE in a Day Java EE Tutorial that embraces the use of a Cloud IDE to let you learn the fundamentals of Java EE in just one day
Java_EE连接器架构

**Java EE 連接器架構**（**英語：Java EE Connector Architecture**，簡稱 **JCA**，原名 **J2EE Connector Architecture**，即有簡稱 **J2C**、**J2CA**）是基於 Java 的連接應用伺服器和企業資訊系統（EIS）的技術解決方案，作為企業應用整合 (EAI) 解決方案的一部分。就像 JDBC 專門用於連接 Java EE 應用和資料庫，JCA 是一種連接 legacy system（包括資料庫）的更通用的體系架構。

在 Java EE 連接器結構中定義了連接器（也稱為資源配接器）和應用伺服器之間的契約，以及客戶端和連接器之間的契約。前者通過服務提供者介面定義，後者通過客戶端呼叫介面定義。

## 外部連結

* 首頁 （頁面存檔備份，存於網際網路檔案館）包含一些有用的資訊。
* 在 JCA， JMS 和 Web 服務之間做出抉擇 （頁面存檔備份，存於網際網路檔案館）。
* J2EE Connector Architecture （頁面存檔備份，存於網際網路檔案館）
Java_IDL

在軟體開發中，**Java 接口定義語言**或 **Java IDL** 是 CORBA 規範的實現，可實現與異構對象的互操作性和連接性。它基本上是 JDK 提供的對象請求代理。在 Java IDL 使分布式 Web 應用程式透明地調用上使用行業標準的遠程網絡服務業務接口描述語言（IDL）和 IIOP 從對象管理組。

## 外部連結

* Sun Developer Network: Core Java: Java IDL
* JDK 6 Java IDL-related APIs & Developer Guides （頁面存檔備份，存於網際網路檔案館）
Java_ME

**Java ME 以往稱作 J2ME**（Java Platform, Micro Edition）是為機上盒、行動電話和 PDA 之類嵌入式消費電子裝置提供的 Java 語言平台，包括虛擬機器和一系列標準化的 Java API。它和 Java SE、Java EE 一起構成 Java 技術的三大版本，並且同樣是通過 JCP（Java Community Process）制訂的。

目前階段，Java ME 最流行的應用是遊戲軟體。因為與需要昂貴的專用裝置和開發工具的競爭對手（如索尼和任天堂）相比，Java ME 程式可以在 PC 機上開發和仿真執行，然後很容易地部署到目標機上，從而使其開發、測試和發布的變得容易和廉價。實際上 Java ME 的用途和前景要廣泛得多。

## 架構

與 J2SE 和 J2EE 相比，J2ME 總體的的執行環境和目標更加多樣化，但其中每一種產品的用途卻更為單一，而且資源限制也更加嚴格。為了在達到標準化和相容性的同時儘量滿足不同方面的需求，J2ME 的架構分為 Configuration、Profile 和 Optional Packages（可選包）。它們的組合取捨形成了具體的執行環境。

Configuration 主要是對裝置縱向的分類，分類依據包括儲存和處理能力，其中定義了虛擬機器特性和基本的類別館。已經標準化的 Configuration 有 - Connected Limited Device Configuration（CLDC）和 Connected Device Configuration（CDC）。

Profile 建立在 Configuration 基礎之上，一起構成了完整的執行環境。它對裝置橫向分類，針對特定領域細分市場，內容主要包括特定用途的類別館和應用程式介面。CLDC 上已經標準化的 Profile 有 Mobile Information Device Profile（MIDP）和 Information Module Profile（IMP），而 CDC 上標準化的 Profile 有 Foundation Profile（FP）、Personal Basis Profile（PBP）和 Personal Profile（PP）。

可選包獨立於前面兩者提供附加的、模組化的和更為多樣化的功能。目前標準化的可選包包括資料庫存取、多媒體、藍牙等等。

## 開發工具

開發 Java ME 程式一般不需要特別的開發工具，開發者只需要裝上 Java SDK 及下載免費的 Sun Java Wireless Toolkit 就可以開始編寫 Java ME 程式，編譯及測試，此外目前主要的 IDE（Eclipse 及 NetBeans）都支援 Java ME 的開發，個別的手機開發商如 Nokia 及 Sony Ericsson 都有自己的 SDK，供開發者在開發出相容於他們的平台的程式。

## 開發

* J2ME Wireless Toolkit，無線裝置的 J2ME 開發工具 （頁面存檔備份，存於網際網路檔案館）
* NetBeans （頁面存檔備份，存於網際網路檔案館）
* Eclipse （頁面存檔備份，存於網際網路檔案館） + EclipseME J2ME Plugin （頁面存檔備份，存於網際網路檔案館）
* JBuilder
* Sun ONE Studio

## 應用

## 參見

* Android
* Danger Hiptop
* Embedded Java
* JavaFX
* Mobile development
* 手機遊戲
* 行動學習
* BREW
* 智慧型手機

## 參考資料

 

## 外部連結

* J2ME 遊戲開發站 - 提供詳細的 J2ME 遊戲開發資料（頁面存檔備份，存於網際網路檔案館）
* J2ME 正式網站 （頁面存檔備份，存於網際網路檔案館）
* TCP/IP Socket Connections with MIDP 2.0 by Sun （頁面存檔備份，存於網際網路檔案館）
* Bluetooth 藍牙支援
* siemens
* J2ME.org （頁面存檔備份，存於網際網路檔案館）
* J2MEDeveloper.com
* openwap.org （頁面存檔備份，存於網際網路檔案館）
* J2MEWorld.com （頁面存檔備份，存於網際網路檔案館）
Java_NIO

**Java NIO**，是 Java SE 1.4 版以後，針對網路傳輸效能優化的新功能。 在 Java 7 時再推出 NIO 2，針對檔案存取的效能優化。

## 特性

Java NIO API 提供在 java.nio 套件或其子套件中。

* 緩衝區的基本資料類型
* 字元集的編碼器和解碼器
* 基於 Perl 風格的正則表達式（在 java.util.regex ）
* 通道 (Channels)，一個新的原生抽象 I/O
* 支援鎖定 (Lock) 和記憶體映射的檔案介面，檔案 Size 最多可以存取到 Integer.MAX\_VALUE（2GB）
* 多工，非阻塞式 I/O 的可擴展性伺服器

## 參考資料
Java_Native_Access

**Java Native Access** (**JNA**) 是一個由社群開發的庫，它使 Java 程式無需使用 Java Native Interface 即可輕鬆存取本地共享庫。JNA 的設計旨在以最少的努力以原生的方式提供本地存取，且不需要樣板代碼或膠水代碼。

## 結構

JNA 庫使用一個稱為外部函式介面庫（libffi）的小型本機庫來動態呼叫本機代碼。JNA 庫使用本地函式，允許代碼按名稱載入庫並檢索指向該庫中函式的指標，使用 libffi 庫來呼叫它，而無需靜態繫結，標頭檔或任何編譯。開發人員使用 Java interface 描述目標本機庫中的函式和結構（struct）。這使得利用平台功能非常容易，而避免了組態或構建 JNI 的高開銷。

JNA 支援在 macOS，Microsoft Windows，FreeBSD / OpenBSD，Solaris，GNU/Linux，AIX，Windows Mobile 和 Android 上構建和測試。經過適當調整和重編譯，可以使其在大多數能夠執行 Java 的平台上執行。

## 類型對應

這個表格顯示了 JNA 所支援的類型與 java 類型，Windows 通用類型的對應關係.

**注意：**根據一些前置處理器指令和不同的實現，TCHAR 可能為 char 或 wchar\_t。LPCTSTR 也是一樣的。

## 資料結構的記憶體位元組對齊

JNA 沒有規定記憶體位元組的對齊方式。JNA 預設為遵循 OS 平台的設定，但也可以自訂對齊方式。如果本機庫的文件中未提供關於記憶體對齊的詳細資訊，則必須通過反覆試驗確定正確的對齊方式。

## 範例

下面這個例子展示了 JNA 如何載入 C 標準庫並使用其中的 printf 函式。

**注意:** 這個例子是跨平台的，這意味著它可以在 Windows / GNU+Linux / Unix /macOS 執行，並得到完全相同的結果。

下面這個例子使用了 C POSIX 庫並呼叫其中的 mkdir 函式。

**注意:** 這個例子在 POSIX 相容的系統中是跨平台的，這意味著它可以在所有 POSIX 相容系統中執行並獲得相同結果，但它無法在大多數 Windows 系統上執行。

下面這個例子載入了 Kernel32.dll 並呼叫了其中的 Beep 和 Sleep 函式。

**注意:** 這個例子只能在 Windows 下執行。

## 用處

JNA 被用於下列專案中：

* Armed Bear Common Lisp, 使用 JNA 實現 CFFI。
* JRuby, 使用 JNA 實現 POSIX 相關功能。
* Freedom for Media in Java (FMJ)。
* JetBrains 的 IntelliJ IDEA。
* OpenSearchServer, 一個開源搜尋引擎。
* SVNKit, 一個純 Java 的 Java Subversion client 庫 ，通過 JNA 實現相關功能。
* VLC media player, 在 vlcj 庫中使用。
* Cyberduck 適用於 FTP, SFTP, WebDAV, Cloud Files & Amazon S3 的瀏覽器。
* Log4j, 附加紀錄檔庫。
* Hudson 和・Jenkins，持續整合伺服器。
* Webdriver。
* YAJSW (Yet Another Java Service Wrapper)。
* Cassandra, 來自 Apache Software Foundation 的開源分布資料庫，使用 JNA。

## 另見

* P/Invoke
* SWIG

## 參考連結

## 外部連結

* Java Native Access Web Page （頁面存檔備份，存於網際網路檔案館）
* Java Native Access - Download page （頁面存檔備份，存於網際網路檔案館）
* Java Native Access - User Mailing List （頁面存檔備份，存於網際網路檔案館）
* Java Native Access:An easier way to access native code （頁面存檔備份，存於網際網路檔案館） by Jeff Friesen, JavaWorld.com,2008-02-05
* Protect Your Legacy Code Investment with JNA by Stephen B. Morris, Java.net,2009-05-20
* Dasgupta, Sanjay. Simplify Native Code Access with JNA. Java.net. 2009-09-11 [2020-07-23]. （原始內容存檔於 2009-11-15）.
* JNA is now a Githubber（頁面存檔備份，存於網際網路檔案館） by Daniel Doubrovkine, 2011-09-20
* Calling the Lotus Domino C-API with JNA （頁面存檔備份，存於網際網路檔案館） by Jesper Kiaer 2010-03-21
Java_Object_Oriented_Querying

**Java 物件導向查詢**（英語：**J**ava **O**bject **O**riented **Q**uerying，縮寫：**JOOQ**），是一個輕量級的 JAVA 資料庫映射類庫。它實現了 Active Record，同時面向「關係」和「對象」提供領域特定語言以構造查詢語句。

## 編程範式

jOOQ 主張，在任何資料庫集成中，都應首先考慮發揮 SQL 的作用。這樣一來，就不必再引入新的查詢語言，而只是通過 jOOQ 對象以及依照資料庫架構自動生成的代碼來創建普通的 SQL。jOOQ 通過 JDBC 來完成底層的 SQL 查詢。
與諸如 Hibernate 等通常 ORM 類庫不同的是，jOOQ 並不提供過多的功能，複雜性也不高，它只是提供了 JDBC 之上更便捷的抽象層封裝而已。

## 代碼範例

嵌套查詢一個起了別名的表

等價的 jOOQ

## 詳見

* Hibernate
* MyBatis
* Ebean
* 對象關係映射軟體列表
* SQL
* ObjectiveSQL

## 外部連結

* jOOQ Home （頁面存檔備份，存於網際網路檔案館）
* JSR-341 （頁面存檔備份，存於網際網路檔案館）
* JaQu （頁面存檔備份，存於網際網路檔案館）
* Linq4j （頁面存檔備份，存於網際網路檔案館）
* Quaere
* QueryDSL （頁面存檔備份，存於網際網路檔案館）
* ObjectiveSql （頁面存檔備份，存於網際網路檔案館）
Java_RMI

**Java 遠端方法呼叫**，即 **Java RMI**（Java Remote Method Invocation）是 Java 程式語言里，一種用於實現遠端程序呼叫的應用程式編程介面。它使客戶機上執行的程式可以呼叫遠端伺服器上的物件。遠端方法呼叫特性使 Java 編程人員能夠在網路環境中分布操作。RMI 全部的宗旨就是儘可能簡化遠端介面物件的使用。

Java RMI 極大地依賴於介面。在需要建立一個遠端物件的時候，程式設計師通過傳遞一個介面來隱藏底層的實現細節。客戶端得到的遠端物件控制代碼正好與原生的根代碼連接，由後者負責透過網路通信。這樣一來，程式設計師只需關心如何通過自己的介面控制代碼傳送訊息。

介面的兩種常見實現方式是：最初使用 JRMP（Java Remote Message Protocol，Java 遠端訊息交換協定）實現；此外還可以用與 CORBA 相容的方法實現。**RMI** 一般指的是編程介面，也有時候同時包括 JRMP 和 API（應用程式編程介面），而 RMI-IIOP 則一般指 RMI 介面接管絕大部分的功能，以支援 CORBA 的實現。

最初的 RMI API 設計為通用地支援不同形式的介面實現。後來，CORBA 增加了傳值（pass by value）功能，以實現 RMI 介面。然而 RMI-IIOP 和 JRMP 實現的介面並不完全一致。

所使用 Java 包的名字是 `**java.rmi**`。

## 參見

* 序列化

## 外部連結

* Java RMI on Sun Developer Network （頁面存檔備份，存於網際網路檔案館）
Java_SE

**J2SE**，**標準版的 Java 平台**是一個 Java2 的平台，為使用者提供一個程式開發環境。這個程式開發環境提供了開發與執行 Java 軟體的編譯器等開發工具、軟體庫及 Java 虛擬機器。它也是 Java2 平台、企業版本和 Java 網頁服務的基礎。

## 參考文獻

## 外部連結

* Oracle Technology Network's Java SE（頁面存檔備份，存於網際網路檔案館）
* Java Training
* Java SE API Javadocs
* Java SE API documentation （頁面存檔備份，存於網際網路檔案館）
* JSR 270 （頁面存檔備份，存於網際網路檔案館） (Java SE 6)
* 1.8
* 1.7
* 1.6
Java_Servlet

**Servlet**（Server Applet），全稱 **Java Servlet**。是用 Java 編寫的伺服器端程式。其主要功能在於互動式地瀏覽和修改資料，生成動態 Web 內容。狹義的 Servlet 是指 Java 語言實現的一個介面，廣義的 Servlet 是指任何實現了這個 Servlet 介面的類別，一般情況下，人們將 Servlet 理解為後者。

Servlet 執行於支援 Java 的應用伺服器中。從實現上講，Servlet 可以回應任何類別型的請求，但絕大多數情況下 Servlet 只用來擴充基於 HTTP 協定的 Web 伺服器。

最早支援 Servlet 標準的是 JavaSoft 的 Java Web Server。此後，一些其它的基於 Java 的 Web 伺服器開始支援標準的 Servlet。

## 歷史

## 工作模式

* 客戶端傳送請求至伺服器
* 伺服器啟動並呼叫 Servlet，Servlet 根據客戶端請求生成回應內容並將其傳給伺服器
* 伺服器將回應返回客戶端
* 其他

## 通用 Servlet

一般來說，通用 Servlet 由 javax.servlet.GenericServlet 實作 Servlet 介面。程式設計人員可以通過使用或繼承這個類別來實現通用 Servlet 應用。

### HttpServlet

javax.servlet.http.HttpServlet 實現了專門用於回應 HTTP 請求的 Servlet，提供了回應對應 HTTP 標準請求的 doGet ()、doPost () 等方法。

## 生命周期

當 servlet 被部署在應用伺服器中（應用伺服器中用於管理 Java 組件的部分被抽象成為容器）以後，由容器控制 servlet 的生命周期。除非特殊指定，否則在容器啟動的時候，servlet 是不會被載入的，servlet 只會在第一次請求的時候被載入和實例化。servlet 一旦被載入，一般不會從容器中刪除，直至應用伺服器關閉或重新啟動。但當容器做記憶體回收動作時，servlet 有可能被刪除。也正是因為這個原因，第一次存取 servlet 所用的時間要大大多於以後存取所用的時間。

servlet 在伺服器的執行生命周期為，在第一次請求（或其實體被記憶體垃圾回收後再被存取）時被載入並執行一次初始化方法，跟著執行正式執行方法，之後會被常駐並每次被請求時直接執行正式執行方法，直到伺服器關閉或被清理時執行一次銷毀方法後實體銷毀。

## 與 JSP 的關係

Java 伺服器頁面（JSP）是 HttpServlet 的擴充。由於 HttpServlet 大多是用來回應 HTTP 請求，並返回 Web 頁面（例如 HTML、XML），所以不可避免地，在編寫 servlet 時會涉及大量的 HTML 內容，這給 servlet 的書寫效率和可讀性帶來很大障礙，JSP 便是在這個基礎上產生的。其功能是使用 HTML 的書寫格式，在適當的地方加入 Java 代碼片段，將程式設計師從複雜的 HTML 中解放出來，更專注於 servlet 本身的內容。

JSP 在首次被存取的時候被應用伺服器轉換為 servlet，在以後的執行中，容器直接呼叫這個 servlet，而不再存取 JSP 頁面。JSP 的實質仍然是 servlet。

## 參見

* Java、JSP、J2EE
* Struts
* HTTP

## 參考文獻

## 外部連結

* JSR 369 （頁面存檔備份，存於網際網路檔案館） - Java servlet 4.0 documentation
* JSR 340 （頁面存檔備份，存於網際網路檔案館） - Java servlet 3.1 documentation
* JSR 315 （頁面存檔備份，存於網際網路檔案館） - Java servlet 3.0 documentation
* JSR 154 （頁面存檔備份，存於網際網路檔案館） - Java servlet 2.4 documentation
* JSR 53 （頁面存檔備份，存於網際網路檔案館） - Java servlet 2.3 documentation
Java_applet

**Applet** 或 **Java 小應用程式**是一種在 Web 環境下，執行於客戶端的 Java 程式組件。它也是 1990 年代中期，Java 在誕生後得以一炮走紅的功臣之一。通常，每個 Applet 的功能都比較單一（例如僅用於顯示一個舞動的 Logo），因此它被稱作「小應用程式」1。JDK 9 以後不再支援。

Applet 必須執行於某個特定的「容器」，這個容器可以是瀏覽器本身，也可以是通過各種外掛程式，或者包括支援 Applet 的行動裝置在內的其他各種程式來執行。與一般的 Java 應用程式不同，Applet 不是通過 main 方法來執行的（參見 Java 的 Hello World 程式和 Java Applet 的 Hello World 程式）。在執行時 Applet 通常會與使用者進行互動，顯示動態的畫面，並且還會遵循嚴格的安全檢查，阻止潛在的不安全因素（例如根據安全策略，限制 Applet 對客戶端檔案系統的存取）。

2016 年，甲骨文公司宣布 Applet 只保留至 JDK 8，JDK 9 以後的版本不再支援，因為 2013 年開始主流的瀏覽器考量安全穩定因素，漸漸不支援外掛程式如 Applet。大部分瀏覽器 2021 年已完全不支援外掛程式。

## 應用範例

* 以 AWT 方式撰寫一個顯示「Hello, world!」的 Java applet。

* 上述 Java 的 Code 編譯成 HelloWorld.class，再透過下述網頁使用。

## 注釋

1. Applet 是由英語「應用程式」_Application_ 的縮寫 **App** 和代表「小」的字尾 **let** 組成。Servlet（**Serv**er-let）、MIDlet（**M**obile **I**nformation **D**evice-let）和 JSP 中的 Scriptlet 的命名也是基於同樣原理。

## 參見

* ActiveX
* Curl
* Java
* Java Servlet
* Java Web Start
* JavaFX
* 多樣化網際網路應用程式
* WebGL
Java_bytecode

**Java 位元組碼**（英語：Java bytecode）是 Java 虛擬機器執行的一種指令格式。大多數操作碼都是一個位元組長，而有些操作需要參數，導致了有一些多位元組的操作碼。而且並不是所有可能的 256 個操作碼都被使用；其中有 51 個操作碼被保留做將來使用。除此之外，原始 Java 平台開發商，昇陽微系統，額外保留了 3 個代碼永久不使用。

## 與 Java 的關係

一個 Java 程式設計師並不需要理解所有的 Java 位元組碼。但是，就像 IBM developerWorks 周刊建議的那樣：「理解位元組碼以及理解 Java 編譯器如何生成 Java 位元組碼與學習組譯知識對於 C/C++ 程式設計師有一樣的意義。」

## 指令

每一個位元組，有 256 個可能的代碼值（28=256），因此一個位元組的操作碼最多可能有 256 種不同的操作。其中，0x00、0xFE、0xCA、0xFF 被指定保留。例如 0xCA 作為一個 Java 除錯器的中斷指令而從未被語言使用。相似地，0xFE 和 0xFF 也未被語言使用。

指令可以基本分為以下幾類：

* 儲存指令 （例如：aload\_0, istore）
* 算術與邏輯指令 （例如: ladd, fcmpl）
* 類型轉換指令 （例如：i2b, d2i）
* 物件建立與操作指令 （例如：new, putfield）
* 堆疊操作指令 （例如：swap, dup2）
* 控制轉移指令 （例如：ifeq, goto）
* 方法呼叫與返回指令 （例如：invokespecial, areturn)

除此之外，還有一些更特殊的指令，作為異常丟擲或同步等作用。

大多數的指令有字首和（或）字尾來表明其運算元的類型。如下表

例如，"iadd" 指令將兩個整數相加；而 "dadd" 指令將兩個 double 浮點數相加。 此外，"const"、 "load"、 "store" 等命令還會使用 "\_n" 字尾，其中 "load" 和 "store" 命令中的 _n_ 可以為 0 到 3 之間的整數；而 "const" 命令中的 n 由類型指定。
"const" 指令把一個指定類型的值放入堆疊。例如 "iconst\_5" 指令將一個整數 5 放入堆疊；而 "dconst\_1" 將一個雙精度浮點數 1 放入堆疊。
此外還有 "aconst\_null" 指令，放入一個 null 進堆疊。而對於 "load" "store" 指令中的 n，指定了變數表中的儲存位置。"aload\_0" 指令把在變數 0 中的物件（通常是 "this" 物件）放入堆疊，"istore\_1" 指令把棧頂的一個整數放入變數 1. 對於更高的變數，字尾將被去除，而這條指令將需要運算元。

## 計算模型

Java 位元組碼的計算模型是堆疊導向結構電腦的。例如，一個 x86 處理器的組譯代碼如下

這段代碼將兩個數值相加，並存入另一個位址。相似的反組譯位元組碼如下

在這裡，需要相加的兩個運算元被放入堆疊，而相加操作就在棧中進行，其結果也被放入堆疊。儲存指令之後把棧頂的資料放入一個變數位址。在每條指令前面的數字僅僅是表示這條指令到方法開始處的偏移值。這種堆疊結構也可以推廣到物件導向模型上。例如，有一個 "getName" 方法如下

## 例子

考慮如下 Java 代碼

假設上述代碼位於一個函式中，Java 編譯器可能將代碼翻譯成下述的 Java 位元組碼。

## 基於 Java 位元組碼的語言

最常用的基於 Java 位元組碼的語言就是開發出 Java 位元組碼的 Java 語言。剛開始，只存在一個由昇陽微系統開發的一個編譯器 javac。而現在 Java 位元組碼規範已經可以得到，因此，第三方公司亦開發出支援 Java 位元組碼的編譯器。例如：

* Jikes，編譯 Java 原始碼到 Java 位元組碼（由 IBM 開發，用 C++ 實現）
* Espresso，編譯 Java 原始碼到 Java 位元組碼（僅支援 Java 1.0）
* GCJ，GNU Compiler for Java，編譯 Java 代碼到 Java 位元組碼；亦可以編譯到機器碼。作為 GNU Compiler Collection (GCC) 的一部分提供。

有一些專案提供 Java 組譯器以便於直接用 Java 位元組碼進行開發。主要的 Java 組譯器如下：

* Jasmin，讀取 Java 類別的文字描述；用一種簡單的使用 Java 虛擬機器指令的類組譯語法，輸出 Java 類別檔案
* Jamaica， 一種為 Java 虛擬機器編寫的宏組合語言。其中，類與介面由 Java 語法定義，而其中的方法卻由 Java 位元組碼定義。

還有其他的一些編譯器，對於其他語言生成 Java 位元組碼，使其可以執行在 Java 虛擬機器之上。

* ColdFusion
* JRuby 和 Jython， 兩種基於 Ruby 和 Python 的手稿語言
* Groovy, 一種基於 Java 的手稿語言
* Scala, 一種類型安全的通用程式語言，支援物件導向程式設計和函式語言程式設計
* JGNAT 和 AppleMagic, 編譯 Ada 語言到 Java 位元組碼
* Clojure, 一種函數式的通用程式語言，提供優秀的並行性。是一種 LISP 方言
* MIDletPascal
* JavaFX Script 由昇陽微系統公司開發的一種手稿語言，執行於 Java 虛擬機器之上

## 執行

當前已經有很多種 Java 虛擬機器產品，包括了自由軟體和商業軟體。
如果在 Java 虛擬機器之中執行 Java 位元組碼並不理想，則可以使用一些工具例如 GNU Compiler for Java 將 Java 代碼或 Java 位元組碼編譯成機器碼並由硬體直接執行。
而有一些處理器可以直接執行 Java 位元組碼，這種處理器名為 Java 處理器。

## 對動態語言的支援

Java 虛擬機器對動態型別語言提供了一定的支援。但絕大多數的 Java 虛擬機器指令集是基於靜態型別語言的。在靜態型別機制下，方法呼叫中的類型分析都是在編譯時執行的，而且缺乏一種機制在執行時確定一個類型已經確定相應的方法。

JSR292 中，在 Java 虛擬機器層次增加了一種支援動態型別的指令 `invokedynamic`，以支援在動態型別檢測中的方法呼叫。 達文西機器則是一種支援這種動態型別呼叫的虛擬機器。 而所有支援 JSE 7 的 Java 虛擬機器都應支援 invokedynamic 操作碼。

## 參考文獻
Java_标注

**Java 註解**又稱 **Java 標註**，是 Java 語言 5.0 版本開始支援加入原始碼的特殊語法元資料。

Java 語言中的類、方法、變數、參數和包等都可以被標註。和 Javadoc 不同，Java 標註可以通過反射取得標註內容。在編譯器生成類檔案時，標註可以被嵌入到位元組碼中。Java 虛擬機器可以保留標註內容，在執行時可以取得到標註內容。
當然它也支援自訂 Java 標註。

## 歷史

Java 平台有許多特別的註解，例如 transient 修飾詞，`@deprecated` javadoc 標籤。2002 年，文案 JSR-175 提出了通用需求的註解（或者說元註解）手段，並在 2004 年 9 月收到許多人的讚賞。從 JDK 1.5 開始，java 開始支援註解。Annotation Processing tool （或者說 apt tool） 提供了一個補充性的編譯時註解操作的介面。文件 JSR-269 將它規格化，在 JDK 1.6 寫入編譯器 javac 中。

## 內建的註解

Java 定義了一套註解，共有 7 個，3 個在 java.lang 中，剩下 4 個在 java.lang.annotation 中

**作用在代碼的註解是**

* @Override - 檢查該方法是否是重寫方法。如果發現其父類別，或者是參照的介面中並沒有該方法時，會報編譯錯誤。
* @Deprecated - 標記過時方法。如果使用該方法，會報編譯警告。
* @SuppressWarnings - 指示編譯器去忽略註解中聲明的警告。

**作用在其他註解的註解（或者說 元註解）是:**

* @Retention - 標識這個註解怎麼儲存，是只在代碼中，還是編入 class 檔案中，或者是在執行時可以通過反射存取。
* @Documented - 標記這些註解是否包含在使用者文件中。
* @Target - 標記這個註解應該是哪種 Java 成員。
* @Inherited - 標記這個註解是繼承於哪個註解類（預設下，註解並沒有繼承於任何子類）

從 Java 7 開始，額外添加了 3 個註解:

* @SafeVarargs - Java 7 開始支援，忽略任何使用參數為泛型變數的方法或建構函式呼叫產生的警告。
* @FunctionalInterface - Java 8 開始支援，標識一個匿名函式或函數式介面。
* @Repeatable - Java 8 開始支援，標識某註解可以在同一個聲明上使用多次。

## 實例

標註可以包含一個關鍵字和值的對所構成的列表：

標註聲明中可以用標註說明使用方式、時間和物件：

編譯器保留一組標註用於特定語法目的 (包括 @Deprecated, @Override 和 @SuppressWarnings 等)。

標註通常用於軟體框架為使用者定義的類和方法提供參照外部資源的情形，如 XML 設定檔、事務環境等。以下是一個標註過的 EJB 3.0 的類：

以上代碼中標註不執行任何特定行為，而是為在執行時，EJB 容器獲得足夠的資訊，生成物件到關聯式資料庫的對映。

## 參考參照
Javac

**javac** 是收錄於 JDK 中的 Java 語言編譯器。該工具可以將字尾名為.java 的原始檔編譯為字尾名為.class 的可以執行於 Java 虛擬機器的位元組碼。

## 使用方法

若開發者使用 IDE 編寫的源程式（副檔名為.java）必須遵從於「The Java Language Specification」，可手工編譯或 IDE 編譯。執行 javac 的實質便是命令列的呼叫：

　
: javac hello.java

即可生成對應的.class 檔案。這種檔案遵從「The Java Virtual Machine Specification」。

需要注意的是，Java 語言規範要求每個公共類所在的原始碼檔案的檔名與其類名相同，除非這個類是一個巢狀類，而 class 檔案所包含的類必須和 class 檔案的檔名相同，包括巢狀類。javac 編譯之後的 class 檔名會被自動命名為其中所包含的類的名字。

## javac 的命令列參數

```
   javac [可按任意次序排列的options] [一个或多个要编译的sourcefiles] [一个或多个对源文件名进行列表的@files] 
```

javac 的具體說明文件見：

## 參見

* Java compiler
* Java
* Java 平臺
* OpenJDK

## 參考文獻

## 外部連結

* The Compiler Group （頁面存檔備份，存於網際網路檔案館）
* JSR 199 （頁面存檔備份，存於網際網路檔案館） Java Compiler API Java Specification Request for invoking the Java compiler from a Java program
Javacc

**JavaCC**（**Java** **C**ompiler **C**ompiler）是一個開源的語法分析器生成器和詞法分析器生成器。JavaCC 根據輸入的文法生成由 Java 語言編寫的分析器。

和 YACC 類似，JavaCC 根據由 EBNF 格式撰寫的形式文法生成語法分析器。不同的是，JavaCC 生成的是自頂向下語法分析器，由於可以向前搜尋 k 個字符，所以可以用來分析 LL (k) 文法。同時，JavaCC 生成詞法分析器的方式和 Lex 也很像。

另外，JavaCC 還提供 JJTree 等輔助工具幫助使用者構建語法樹。

## 歷史

在 1996 年，Sun Microsystems 推出了一個名叫「Jack」的語法解析器生成器。後來，負責「Jack」的開發者創辦了自己的公司 ——Metamata，並將「Jack」改名為「JavaCC」。Metamata 最後成為了 WebGain 的一部分，在 WebGain 關閉後，JavaCC 才移動到了現在的主頁。

## 使用

使用 JavaCC 構建的軟體：

* Apache Derby
* BeanShell
* FreeMarker
* PMD
* Vaadin
* Apache Lucene
* JavaParser

## 另見

* ANTLR
* SableCC
* Coco/R
* parboiled

## 外部連結

JavaCC FAQ （頁面存檔備份，存於網際網路檔案館）

## 參考
Javad_Nekounam

**賈瓦德・內科南**（波斯語：**جواد نکونام‎**，Javad Nekounam，1980 年 9 月 7 日 —）是伊朗職業足球員，司職後腰。

## 俱樂部生涯

內科南在 2006 年世界盃的優異演出，吸引到哈化柏林、里昂垂青，但他最後選擇加盟奧薩蘇納，簽約兩年，他之前效力過伊朗的帕斯、阿聯的艾華達和艾沙迦。

## 國際賽生涯

內科南自 2002 年 5 月開始代表伊朗國家足球隊，他替伊朗贏得 2002 年亞運會、2004 年西亞足球錦標賽，他還代表伊朗出席過 2002 年西亞足球錦標賽、2004 年和 2007 年亞洲盃。

## 俱樂部紀錄

## 榮譽

* 帕斯:
  * 伊朗足球超級聯賽: 2003-04
* 伊朗:
  * 亞洲挑戰盃: 2003
  * 亞洲國家盃: 2002
  * 西亞足球錦標賽: 2004

## 注釋

## 參考資料

## 相關連結

* Javad Nekounamat TeamMelli.com（頁面存檔備份，存於網際網路檔案館）
* RSSSF archive of Javad Nekounam's international appearnces and goals（頁面存檔備份，存於網際網路檔案館）
* Javad's profile on Official Website of C.A. Osasuna
* Nekounam states Euro ambition - Article from Sky Sports
* Javad Nekounam - Osasuna's New Star（頁面存檔備份，存於網際網路檔案館） - Article from Goal.com （頁面存檔備份，存於網際網路檔案館）
Javadoc

**Javadoc**（最初是 **JavaDoc**）是由 Sun Microsystems 為 Java 語言（現在由甲骨文公司擁有）創建的文檔生成器，用於從 Java 原始碼生成 HTML 格式的 API 文檔，HTML 格式用於增加將相關文檔連結在一起的便利性。

Javadoc 使用的「doc comments」格式 是記錄 Java 類的事實上的行業標準。一些 IDE，如 IntelliJ IDEA、NetBeans 和 Eclipse，可以自動生成 Javadoc HTML。許多文件編輯器幫助用戶生成 Javadoc 原始碼並使用 Javadoc 信息作為程式設計師的內部引用。

Javadoc 還提供了用於創建 doclet 和 taglet 的 API，允許用戶分析 Java 應用程式的結構，這就是 JDiff 如何生成兩個 API 版本之間發生變化的報告。

Javadoc 不影響 Java 中的性能，因為在編譯時會刪除所有注釋。編寫注釋和 Javadoc 是為了更好地理解代碼，從而更好地維護代碼。

## 歷史

Javadoc 是早期的 Java 語言文檔生成器。在使用文檔生成器之前，習慣上由專業的技術編寫者編輯文檔，他們通常只編寫軟體的獨立文檔，但要使這些文檔與軟體本身保持同步要困難得多。

自第一個版本以來，Java 一直使用 Javadoc，並且通常在 Java 開發工具包的每個新版本上都會更新。

## 技術架構

### Javadoc 注釋結構

通過標準多行注釋標記 `/*` and `*/` 從代碼中引發 Javadoc 注釋。起始標記（稱為開始 - 注釋分隔符）具有額外的星號，如 `/**` 中所示。

1. 第一段是對所記錄方法的描述。
2. 在描述之後是不同數量的描述性標籤，表示：
  1. 方法的參數（`@param`）
  2. 方法返回的內容（`@return`）
  3. 方法可能拋出的任何異常（`@exception`）
  4. 其他不太常見的標籤，如 `@see` （「另見」標籤）

### Javadoc 概覽

編寫文檔注釋的基本結構是將它們嵌入到 `/**.` 中。Javadoc 寫在項目旁邊，沒有任何分隔換行符。請注意，任何 import 語句必須在類聲明之前。類聲明通常包括：

對於方法，有如（1）所示的簡潔的一行描述來解釋項目的作用；接下來是（2）所示的更長的描述，該描述可以跨越多個段落並且是可有可無的；最後，第（3）部分列出接受的輸入參數和方法的返回值。所有的 Javadoc 都被視為 HTML，因此多個段落部分由 "`<p>`" 段落符號分隔。

與方法類似的注釋也可以用於變量的注釋，但省略了第（3）部分，這裡只包含了對變量的簡短描述：

請注意，不建議在單個文檔注釋中定義多個變量。這是因為 Javadoc 讀取每個變量並將它們分別放置到生成的 HTML 頁面，其中包含為所有欄位複製的相同文檔注釋。

相反，建議分別聲明和注釋每個變量：

### Javadoc 標籤表

一部分可用的 Javadoc 標籤列在下表中：

### 示例

下面是注釋一個方法的 Javadoc 示例。

## 參見

* 文檔生成器的比較
* .Net 的 XML 文檔注釋

## 參考文獻

*
Javaee

**Java EE**，Java 平台企業版（Java Platform Enterprise Edition），之前稱為 Java 2 Platform, Enterprise Edition (J2EE)，2018 年 3 月更名為 **Jakarta EE**。是 Sun 公司為企業級應用推出的標準平台。Java 平台共分為三個主要版本 **Java EE**、Java SE 和 Java ME。

Sun 公司在 1998 年發表 JDK1.2 版本的時候，使用了新名稱 Java 2 Platform，即「Java2 平台」，修改後的 JDK 稱為 Java 2 Platform Software Developing Kit，即 J2SDK。並分為標準版（Standard Edition，J2SE），企業版（Enterprise Edition，J2EE），微型版（MicroEdition，J2ME）。J2EE 便由此誕生。

2005 年 6 月，JavaOne 大會召開，SUN 公司公開 Java SE 6。此時，Java 的各種版本已經更名以取消其中的數字「2」：J2EE 更名為 Java EE, J2SE 更名為 Java SE，J2ME 更名為 Java ME。

隨著 Java 技術的發展，J2EE 平台得到了迅速的發展，成為 Java 語言中最活躍的體系之一。現如今，J2EE 不僅僅是指一種標準平台，它更多的表達著一種軟體架構和設計思想。

## 組件

Java EE 是一系列技術標準所組成的平台，包括：

* EJB - 企業級 JavaBean（Enterprise Java Beans）
* JAAS - Java Authentication and Authorization Service
* JACC - J2EE Authorization Contract for Containers
* JAF - Java Beans Activation Framework
* JAX-RPC - Java API for XML-Based Remote Procedure Calls
* JAX-WS - Java API for XML Web Services
* JAXM - Java API for XML Messaging
* JAXP - Java XML 解析 API（Java API for XML Processing）
* JAXR - Java API for XML Registries
* JCA - J2EE 連接器架構（J2EE Connector Architecture）
* JDBC - Java 資料庫聯接（Java Database Connectivity）
* JMS - Java 訊息服務（Java Message Service）
* JMX - Java Management
* JNDI - Java 名稱與目錄介面（Java Naming and Directory Interface）
* JSF - Java Server Faces
* JSP - Java 伺服器頁面（Java Server Pages）
* JSTL - Java 伺服器頁面標準標籤庫（Java Server Pages Standard Tag Library）
* JTA - Java 事務 API（Java Transaction API）
* JavaMail
* Servlet - Java Servlet API
* StAX - Streaming APIs for XML Parsers
* WS - Web Services
* Applet - Java Applet

## 版本歷史

* J2EE 1.2 (1999 年 12 月 12 日)
* J2EE 1.3 (2001 年 9 月 24 日)
* J2EE 1.4 (2003 年 11 月 11 日)
* Java EE 5 (2006 年 5 月 11 日)
* Java EE 6 (2009 年 12 月 10 日)
* Java EE 7 (2013 年 5 月 28 日)
* Java EE 8 (2017 年 8 月 31 日)

## 參見

* Web 容器
* 部署描述符
* Java BluePrints
* Sun Java System Portal Server
* Java EE version history
* Sun Community Source License
* Java Research License

## 參考文獻

## 外部連結

* Oracle Technology Network's Java EE（頁面存檔備份，存於網際網路檔案館）
* Oracle's Java EE Compatibility page （頁面存檔備份，存於網際網路檔案館） - Certified Java EE Compatible Implementations
* Core J2EE Patterns（頁面存檔備份，存於網際網路檔案館）
* A short tutorial introducing beginning Java EE developers to the Java EE platform （頁面存檔備份，存於網際網路檔案館）
* Cloud Tutorial - Java EE in a Day Java EE Tutorial that embraces the use of a Cloud IDE to let you learn the fundamentals of Java EE in just one day
Javascript引擎

**JavaScript 引擎**是一個專門處理 JavaScript 指令碼的虛擬機器，一般會附帶在網頁瀏覽器之中。

## 歷史

在 2008 年到 2009 年的第二次瀏覽器大戰之前，JavaScript 引擎僅簡單地被當作能閱讀執行 JavaScript 原始碼的直譯器。

* SpiderMonkey：第一個 JavaScript 引擎，由布蘭登・艾克在網景公司開發，用於 Netscape Navigator 網頁瀏覽器中，由 C++ 實作。自 JavaScript 1.5 升級以符合 ECMA-262 版本 3。
* Rhino：由網景公司的諾里斯・博伊德（Norris Boyd）開發，由 Java 實作。像 SpiderMonkey 一樣，Rhino 符合 ECMA-262 版本 3。
* Nitro：Apple Safari 4 開始支援
* V8：Google Chrome 製作
* TraceMonkey：Mozilla Firefox 3.5 開始支援

目前為止，最通用的 JavaScript 宿主環境是網頁瀏覽器。網頁瀏覽器一般使用公共的 API 建立「宿主物件」以便於在 JavaScript 中支援 DOM。

## 效能演進

一個典型的瀏覽器有一個圖形引擎和一個獨立的 JavaScript 引擎。這樣 JavaScript 引擎能夠被更方便的測試、重新生成或者在另一些專案中使用。例如：Carakan 被用在 Presto 中，Nitro 被用在 WebKit 中，SpiderMonkey 被用在 Gecko 中，KJS 被用在 KHTML 中，Rhino 預設不包含任何布局引擎。但還有其他組合，例如：V8 與 WebKit 被用於 Google Chrome 中。JavaScript 引擎能為程式設計師提供部分操作瀏覽器的功能（網路、DOM、外部事件、HTML5 影片、canvas 和儲存）。

Sunspider 是一個 JavaScript 實用基準測試通過一系列關於 JavaScript 語言的指令碼測試 JavaScript 引擎的速度。Sunspider 不測試無關於 JavaScript 的特性（不使用 HTML、CSS 和無網路情況下）。

近幾年來，在瀏覽器開發者之間展開了一場開發更快的 JavaScript 引擎的競賽。2008 年，Google Chrome 因它的 JavaScript 效能而倍受稱讚，但是其它瀏覽器馬上使用了更快的 JavaScript 引擎。之後，Google Chrome 在效能上獲得領先，其長處在於它高速的效能和 JavaScript 的處理速度，這些都由許多網站在主要的瀏覽器之間的速度測試中得到驗證。隨著 WebKit 的 Squirrelfish Extreme 和 Mozilla 的 TraceMonkey JavaScript 虛擬機器出現，Chrome 的 JavaScript 執行速度就被超越了。Google 丹麥在 Chrome 2 中開發了更快速的 V8 引擎。

2008 年 6 月 2 日，WebKit 開發團隊發布了 SquirrelFish—— 一個能極大地提升 Safari 解釋指令碼速度的新的 JavaScript 引擎。該引擎是 Safari 4 其中一個新特性，在 2008 年 6 月 11 日發布給程式設計師使用；最終此 JavaScript 引擎被稱為 Nitro。2009 年 6 月 30 日，在 Firefox 3.5 發布的最新技術能「使某些情況下的速度提升 20 到 40 倍」。

## 著名的引擎

### 開發中

* Rhino，由 Mozilla 基金會管理，開放原始碼，完全以 Java 編寫。
* SpiderMonkey，第一款 JavaScript 引擎，早期用於 Netscape Navigator，現時用於 Mozilla Firefox。
* V8，開放原始碼，由 Google 丹麥開發，是 Google Chrome 的一部分。
* JavaScriptCore，開放原始碼，用於 Safari。
* Chakra (JScript 引擎)，用於 Internet Explorer。
* Chakra (JavaScript 引擎)，用於 Microsoft Edge。
* KJS，KDE 的 ECMAScript／JavaScript 引擎，最初由哈里・波頓開發，用於 KDE 專案的 Konqueror 網頁瀏覽器中。

### 停止開發

* Linear A，用於 Opera 4.0 至 6.1 版本。
* Linear B，用於 Opera 7.0 至 9.2 版本。
* Futhark，用於 Opera 9.5 至 10.2 版本。
* Carakan，用於 Opera 10.5 至 12.1 版本。
* Nashorn，Oracle 於 JDK 1.8 發布，內嵌於 Java 的 javascript 引擎。於 Java 11 改為棄用並於 Java 15 正式移除。
* Narcissus，開放原始碼，由布蘭登・艾克編寫（他也編寫了 SpiderMonkey）。
* Tamarin，由 Adobe Labs 編寫。

## 實作

JavaScript 是一種 ECMAScript 方言，在許多程式中得以實作，特別是在網頁瀏覽器。這些方言通常擴充了語言，或者標準庫和相關 API，例如 W3C 定義的 DOM。這意味著以一種方言實作的程式不相容於另一種方言的實作，除非程式使用了方言中的公共子集所具有的特性和 API。

在實作和方言中存在著一些差別。一種語言的方言有一些與語言不同的地方。實作能夠執行該語言或方言編寫的程式。

## 參考來源

## 外部連結

* Kraken JavaScript Benchmark （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
* Peacekeeper （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
* Speed-Battle （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試
* SunSpide （頁面存檔備份，存於網際網路檔案館） - 瀏覽器效能測試