国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

如何避免Microsoft非標準JavaSDK的潛在危險

2019-11-18 14:46:17
字體:
來源:轉載
供稿:網友

  ─ ─Microsoft在其實現的java 1.1要害類
庫中所增加或省略的方法、類和變量

--------------------------------------------------------------------------------

摘 要Sun 在 宣 布 其 控 訴Microsoft 違 反Java 兼 容 性 問 題 協 議 的 起 訴 中 提 出, 對Java 關 鍵 類 庫 的 修 改 是 錯 誤 的。 在 本 文 中,JavaWorld 投 稿 人、Java 開 發 者John Zukowsk 對Microsoft 新 的SDK 中 到 底 增 加 和 省 略 了 那 些 類、 方 法 和 變 量 做 了 簡 明、 全 面 的 總 結。 本 文 提 供 了Sun 和 其 他 公 司 僅 僅 暗 示 的、 在Microsoft Java SDK 中 發 現 的 修 改 的 全 面 列 表, 以 及 每 個 修 改 的 含 義 和 開 發 者 如 何 定 位 任 一 改 變/ 增 加/ 省 略。 總 之, 本 文 說 明 了 用Microsoft 產 品 創 建 真 正 的" 編 寫 一 次, 隨 處 運 行" 的 應 用 和 創 建 在Microsoft Internet EXPlorer 4.0 上 運 行 的 程 序 時 所 必 須 知 道 的。

Microsoft Internet Explorer 4.0 和2.0 版 的Java SDK 均 已 推 出。 根 據Microsoft Win32 Java 虛 擬 機 的 發 布 注 釋,IE 4.0 與 新 的SDK 中 的Java 虛 擬 機 是 相 同 的。 將SDK 中 的Java 類 文 件 與Sun 的Java SDK 1.1.4 release 中 的 文 件 比 較, 就 會 明 白 為 什 么Sun JavaSoft 部 的 總 裁Alan Baratz 說"Microsoft 欺 騙 性 地 修 改 了 關 鍵 類, 并 加 入 到 其SDK 中" 參 見10 月 份 新 聞。

我 分 析 了 類, 遇 到 了 七 個 方 面 的 問 題。 如 果 要 用Microsoft Java SDK 開 發 在 其 他Java 1.1 認 證 的 環 境 中 可 以 運 行 的 應 用, 應 該 特 別 注 意 這 些 問 題, 它 們 是:

1. 新 類
2. 新 方 法
3. 新 變 量
4. 更 改 的 接 口
5.com.ms 包
6. 省 略 的 方 法
7. 動 作 差 別

Baratz 在Sun 宣 布 其 起 訴 時 用" 欺 騙" 一 詞 是 因 為SDK 中 所 帶 的 關 于Java 類 的 文 檔 沒 有 提 到 這 些 修 改。 要 發 現 它 們, 必 須 用SDK 所 帶 的ClassVue 工 具 或 者 人 工 地 讀 源 代 碼。 最 好 使 用ClassVue, 因 為SDK 提 供 的 源 代 碼 可 能 并 不 是 產 生 類 的 文 件, 對 不 熟 悉ClassVue 的 人, 等 價 的 工 具 是Sun SDK 提 供 的 類 文 件 內 部 檢 查 器javap。

以 下 是 一 張SDK 中 所 有 修 改 的 清 單, 但 是 也 有 可 能 有 疏 漏。 這 里 提 到 的 所 有 修 改 都 在java.lang、java.io、java.awt、java.util 和java.security 包 或 子 包 中, 每 個 包 的 修 改 如 下:

java.lang: 新 方 法、 新 變 量

java.io: 省 略 方 法

java.awt: 新 類、 新 方 法、 新 變 量

java.util: 新 方 法、 新 變 量

java.security: 修 改 接 口
新 類
首 先,Microsoft 在 其Java SDK 系 統 包 中 增 加 了 新 的 類、 方 法 和 變 量。 所 有 在 完 全 修 飾 名 中 以java.* 開 頭 的 叫 做 系 統 包 或 者 核 心Java API。 十 六 個 新 類 加 入 到 了java.awt 中, 它 們 是:

Microsoft 新 增 加 的AWT 同 位 類 的Java 類 WButtonPeer WCheckboxMenuItemPeer WCheckboxPeer WChoicePeer
WLabelPeer WListPeer WMenuBarPeer WMenuItemPeer
WMenuPeer WPopupMenuPeer WScrollbarPeer WScrollPanePeer
WTextAreaPeer WTextComponentPeer WTextFieldPeer WUipeer

除 了 最 后 一 個, 所 有 的 類 都 是AWT 構 件 的 同 位(peer) 類。 同 位 類 是 諸 如 按 鈕 和 菜 單 的 圖 形 構 件 在 特 定 平 臺 的 表 示。 一 般 來 說, 這 些 類 會 出 現 在 不 同 的 包 中, 如sun.awt.windows 或 者sun.awt.motif, 你 可 以 不 使 用 它 們, 故 很 容 易 避 免。WUIPeer 也 是 一 個 同 位 類, 但 是 它 支 持Microsoft 專 用 的 動 作, 應 該 避 免 使 用 它。 另 外 還 加 入 了 其 他 的 包 私 有(package-PRivate) 類( 也 稱 為 友 類, 無 須 增 加 訪 問 分 類 符 關 鍵 字), 如_AwtUIBand 和_UIMenuRoot。 因 為 在java.awt 之 外 是 不 可 訪 問 的, 故 不 能 直 接 使 用。

新 方 法 和 實 例 變 量
增 加 最 多 的 方 法 是getBaseName()。 幸 好 它 是 包 私 有 的。 其 他 的 修 改, 例 如 將classLoader 的loadClassInternal() 方 法 由 包 私 有 變 為 私 有 是 由 于 實 現 上 的 差 別, 不 影 響 開 發 者。

不 是 我 忽 視Microsoft 的 包 私 有 修 改, 但 是 除 非 開 發 者 自 己 擴 展Java 關 鍵 類 庫, 否 則 就 涉 及 不 到 這 些 修 改。 因 為 開 發 者 更 多 的 時 候 是 尋 求 一 種 跨 平 臺 的 解 決 方 案, 而 不 是 將 自 己 的 修 改 加 入 到 關 鍵Java 類 庫 中 去, 所 以 這 不 是 問 題。 而 真 正 的 問 題 是Microsoft 新 加 入 的 公 用 方 法。

關 鍵Java 類 庫 中 加 入 的 公 用 方 法 類 新方法
java.awt.EventQueue _postEvent(AWTEvent)
java.awt.Font getNativeData()
java.awt.image.ColorModel finalize()[was protected]
java.awt.image.DirectColorModel getToolkitData()
java.awt.image.IndexColorModel getOpaque()
getToolkitData()
java.awt.SystemColor getWin32Index()
java.lang.Class getInterface(string)
getMethods(int[])
getMethodFromSignature(string,String)
getDeclaredMethodFromSignature(String,String)
java.lang.Runtime getNativeServices()
java.lang.SecurityManager checkFileDialog()
checkMultimedia()
checkRegistry(int,String)
checkSystemStreams(int)
java.lang.VerifyError getAuditDetails()
getAuditIdentifier()
getClassName()
getMethodName()
getPC()
getViolationCode()
getViolationDescription()
java.lang.reflect.Method getDescriptor()
getParameterCount()
java.util.Locale Locale(String,String,String,int,int)
getCodePage()
getDefaultLocaleList()
getLCID() [was private]
getLocaleFromLCID(int)
java.util.ResourceBundle getMenu(String)
getMenuBar(String)

除 非 你 只 在Microsoft 的 環 境 中 運 行 你 的Java 程 序, 否 則 就 應 該 避 免 使 用 這 些 方 法。 除 此 之 外 還 有 三 個 新 的 實 例 變 量 和 為 數 不 少 的 國 際 化 地 區 變 量。

加 入 到Java API 中 的 實 例 變 量 類 新變量
java.awt.Font pData
java.awt.SystemColor appWorkspace
java.lang.reflect.Member PUBLIC_DECLARED
java.util.Locale AFRIKAANS
ALBANIAN
AUSTRALIA
BASQUE
BELGIAN
BELGIAN_FRENCH
BRAZILIAN
BULGARIAN
BYELORUS
CATALAN
CROATIAN
CZECH
DANISH
DUTCH
ESTONIAN
FINNISH
GERMAN_AUSTRIAN
GERMAN_SWISS
GREEK
HEBREW
HUNGARIAN
ICELANDIC
INDONESIAN
IRELAND
JAPANESE_VERTICAL KOREAN_VERTICAL
LATVIAN
LITHUANIAN
MEXICAN
NEWZEALAND
NORWEGIAN
NORWEGIAN_NYNORSK
POLISH
PORTUGESE
ROMANIAN
RUSSIAN
SERBIAN
SIMPLIFIED_CHINESE_VERTICAL
SINGAPORE
SLOVAKIAN
SLOVENIAN
SOUTH_AFRICA
SPANISH
SPANISH_MODERN
SWEDISH
SWISS
THAI
TRADITIONAL_CHINESE_VERTICAL
TURKISH
UKRANIAN

PUBLIC_DECALRED 對Member 是 全 新 的,appWorkspace 對SystemColor 也 是 全 新 的, 而pData 則 由 私 有 變 為 公 用。 與 其 他 修 改 一 樣, 必 須 避 免 使 用。 就Locale 對 象 而 言,Microsoft 環 境 支 持 另 外 幾 種 語 言, 而JavaSoft 不 支 持。 雖 然 不 使 用 這 些 新 的 地 區 變 量 要 求 你 格 式 化 消 息 時 做 額 外 的 工 作, 但 是 還 是 應 該 避 免 使 用, 而 用 必 要 的 參 數 自 己 創 建 一 個Locale 對 象。

對 每 個 新 加 入 的 地 區 變 量, 在java.text.resource 包 中 都 加 入 了 兩 個 公 用 類, 因 為Sun 的docUCentation 特 別 聲 明, 不 應 該 直 接 調 用text.resource 中 的API, 所 以 這 也 不 是 問 題。

接 口 修 改
接 口 定 義 了 類 必 須 遵 循 的 部 分 摸 板,Microsoft 修 改 了 部 分 安 全 接 口 摸 板:

Java 安 全 接 口 中 增 加 的 方 法 接口 新方法
java.security.interfaces.DSAPrivateKey getAlgorithm()
getEncoded()
getFormat()
getParams()
java.security.interfaces.DSAPublicKey getAlgorithm()
getEncoded()
getFormat()
getParams()

當 創 建 一 個 實 現 某 一 接 口 的 類 時, 必 須 定 義 接 口 中 聲 明 的 每 個 方 法。Microsoft 增 加 了 接 口 中 的 方 法 數 量, 破 壞 了 所 有 實 現 以 前 接 口 的 類。 若 要 創 建 在Microsoft 和 非Microsoft 環 境 中 都 能 運 行 的 程 序, 只 要 你 在 類 中 實 現 了 修 改 的 接 口, 就 必 須 實 現 其 中 增 加 的 方 法。

com.ms 包
com.ms 是 一 組 與Microsoft 建 議 的Java 實 現 一 起 發 表 的 類。 所 有 的 類 在com.ms 包 中, 所 以 用Netscape Navigator/Communicator 和Java 1.1 都 無 法 訪 問。 如 果 你 使 用 了com.ms 包 中 的 類, 便 失 去 了 可 移 植 性。 以 下 是 一 個 例 子: 一 個 不 知 情 者 用getFontMetrics() 從Toolkit 類 中 獲 取FontMetrics, 此 方 法 的 簽 名 說 明 也 是"public FontMetrics getFontMetrics()", 此 方 法 返 回com.ms.awt.FontMetrics 的 一 個 實 例。 如 果 你 將 它 看 作 一 個FontMetrics, 那 么 你 的 程 序 只 能 在Microsoft 的Java 虛 擬 機 上 運 行。 而 如 果 你 堅 持 用FontMetrics, 則 可 以 移 植。

但 是 避 免 使 用com.ms 時 也 有 一 個 例 外,com.ms.ui 中Microsoft 應 用 程 序 基 礎 類(AFC) 是 用Java 寫 的, 所 以 可 以 使 用。 然 而, 如 果 你 不 使 用IE 4.0, 就 得 單 獨 提 供AFC。( 除 非Microsoft 將AFC 類 捆 綁 到 在 非Microsoft 環 境 中 可 用 的 東 西 上, 否 則 必 須 單 獨 提 供AFC, 因 為AFC 類 包 含 在IE4 中, 而 其SDK 依 賴Microsoft Java 虛 擬 機 特 性。AFC 類 不 久 將 會 捆 綁 到 其 他 瀏 覽 器 上, 如Netscape Navigator 3.0。 詳 細 信 息 參 看Microsoft 站 點。)  

SDK 中 得 省 略
在 我 檢 查 過 的 類 中, 只 從Microsoft 建 議 的Java 1.1 實 現 中 省 略 了 一 個 方 法。 省 略 此 多 余 的 方 法 相 對 來 說 并 不 重 要。 確 切 地 說,ByteArrayOutputStream 中 接 受 字 符 編 碼 名 參 數 的toString() 方 法 省 略 了。 對 此 省 略 的 回 避 辦 法 是 請 求 流 的 字 節 數 組(toByteArray()), 然 后 使 用 接 受 編 碼 名 的string 構 造 器。 用 這 兩 步, 即 使 用JDK, 也 能 建 立 在Microsoft 運 行 時 環 境 中 運 行 的 程 序。

差 別
最 后 我 要 討 論 的 這 些 修 改 與 新 增 加 的 類 和 省 略 的 方 法 無 關, 而 與 動 作 上 的 差 別 有 關。 無 論 何 時, 只 要 有 一 個 新 的 環 境 推 出, 你 就 有 必 要 弄 清 楚 它 與 你 期 望 的 動 作 有 和 不 同。 例 如,Netscape Navigator 3.0 beta 5 推 出 時, 瀏 覽 器 向 程 序 報 告 額 外 的AWT 事 件, 如 果 你 的 程 序 沒 有 考 慮 額 外 的 事 件, 就 會 不 正 常 動 作。 對 新 的SDK, 我 們 又 得 面 對 這 種 差 別。

起 初Microsoft Win32 Java 虛 擬 機 聲 稱 是Java1.1( 注 意 在"1.1" 的 第 二 個1 后 面 沒 有 東 西)。 現 在,Sun 推 出 了Java 1.1.4 版 本 的SDK, 這 意 味 著 在Microsoft Java 虛 擬 機 中 并 未 包 括 你 所 期 望 的 錯 誤 修 正。 也 有 可 能 因 為 實 現 上 的 差 別 或 者Microsoft 自 己 修 正 了 這 些 錯 誤, 并 不 需 要Sun 的 這 些 錯 誤 修 正。 然 而 只 要 看 一 眼 源 代 碼 并 作 比 較, 就 會 發 現 明 顯 的 功 能 差 別。 如 果SDK 并 未 按 照 你 的 期 望 動 作, 你 需 要 適 當 地 調 整 你 的 程 序。

例 如 使 用java.awt.BorderLayout, 當 你 增 加 一 個 沒 有 方 位 名(quadrant name) 的 構 件 時, 在JDK 或 者Java 運 行 時 環 境(JRE) 中, 它 會 出 現 在 中 間 方 位 上。 當 增 加 一 個 非 法 方 位 名 的 構 件 時, 如"TOP",BorderLayout 便 拋 出 一 個IllegalArgumentException 異 常。 然 而 在Microsoft 環 境 中 運 行 同 一 個 沒 有 方 位 名 的 程 序, 構 件 根 本 就 不 會 在 任 何 地 方 顯 示( 影 響Swing JFrame 構 件 使 之 不 可 用 )。 另 一 個 差 別 是 在Microsoft 環 境 中,Dialog 類 接 受 一 個 空 的 父Frame 參 數。 而Sun JDK 中 則 拋 出 一 個IllegalArgumentException 異 常。 越 多 地 在IE 4.0 下 運 行 程 序, 這 些 差 別 就 會 越 多 地 顯 現 出 來。 對 于 更 傾 向 于 技 術 的 讀 者, 這 里 有 一 些 更 進 一 步 修 改 的 細 節。 其 他 的 動 作 差 別, 其 中 一 些 是 對 原 來 系 統 的 提 高, 對 開 發 者 是 不 可 見 的。 例 如, 對 象 鎖 定 可 以 在 不 同 級 上 實 現。 Microsoft 所 做 的 任 何 提 高, 有 望 在SDK 中 得 到 體 現, 反 之 亦 然。Microsoft 環 境 中 額 外 的 性 能 提 高 也 會 反 映 到SDK 中。 例 如, 在Microsoft 環 境 中, 要 改 變 一 個 構 件 的 顏 色 或 字 體 時, 先 檢 查 新 值 是 否 與 舊 值 不 同, 如 果 相 同, 不 做 改 變。 而 在Sun 的 環 境 中, 即 使 是 不 必 要 的, 也 盲 目 地 做 改 變。 象 這 樣 的 小 的 修 改 可 能 導 致 很 大 的 性 能 提 高。

結 果
毫 無 疑 問,Microsoft 對Java 關 鍵 類 庫 做 了 修 改。Microsoft 能 否 合 法 地 與Sun 達 成 協 議, 完 全 掌 握 在 法 院 的 手 中。 雖 然 總 的 來 說, 這 些 修 改 相 對 較 小, 但 畢 竟 是 修 改 了。 如 果 法 院 因 為 這 些 修 改 不 重 要 而 宣 布 其 不 礙 大 局, 那 么 如 何 阻 止 其 他 修 改 呢 ?

以 下 我 們 快 速 回 顧 一 下 這 些 修 改, 以 及 對 開 發 者 及 用 戶 帶 來 的 問 題。

不 支 持RMI 和JNI: 如 果 程 序 需 要 這 些 功 能, 則 不 能 正 常 運 行。 開 發 者 必 須 與Sun 的Java 運 行 時 環 境(JRE) 一 起 發 布 程 序, 以 保 證 有 一 個 兼 容 的 環 境。 這 就 導 致 有 些 在 瀏 覽 器 中 作 為 小 程 序 運 行 得 更 好 的 程 序, 也 必 須 轉 換 為 一 個 單 獨 的 應 用 程 序。

增 加 的 類、 方 法 和 變 量: 要 開 發100% 純Java 解 決 方 案, 開 發 者 就 要 避 免 使 用。 雖 然 這 比 較 容 易 實 現, 但 是 當 開 發 者 不 小 心 使 用 了 這 些 不 可 移 植 的 特 征 時, 沒 有 類 似 于@ 的 標 志 來 警 告 他 們。 如 果 開 發 者 粗 心, 只 有 等 到 在Microsoft Win32 虛 擬 機 以 外 的 環 境 中 運 行, 程 序 終 止 運 行 或 者 根 本 就 不 啟 動 時, 用 戶 才 會 發 現。

在 接 口 中 增 加 方 法: 與 下 一 點 一 起, 這 可 能 是 最 大 的 錯 誤 之 一。 實 現 被 改 變 接 口 的 類 在Microfoft 環 境 中 運 行 的 可 能 性 是 微 乎 其 微 的。 要 使 這 些 類 運 行, 你 必 須 引 入 相 同 命 名 和 相 同 功 能 的 方 法。 為 了 創 建 在Microsoft 和 非Microsoft 環 境 中 都 運 行 的 解 決 方 案, 開 發 者 必 須 定 義 由Microsoft 擴 展 接 口 規 定 的 命 名 和 動 作 的 方 法。 否 則, 以 前 使 用 這 些 接 口 的 可 運 行 的 解 決 方 案 將 不 能 在Microsoft Win32 虛 擬 機 上 運 行。

省 略ByteArrayOutputStream 方 法: 雖 然 這 個 省 略 的 方 法 相 對 并 不 重 要, 但 是 這 可 能 是 最 大 的 錯 誤 之 一。100% 純Java 程 序 可 能 在Netscape Navigator 或JDK/JRE 中 運 行 得 很 好, 但 就 是 不 能 在Microsoft 環 境 中 運 行。 除 非 間 接 地 使 用 了 此 方 法, 否 則 很 容 易 繞 開 它。 然 而 對 已 分 發 的 產 品, 這 意 味 著 無 盡 頭 地 浪 費 的 技 術 支 持 時 間。 可 能 必 須 更 新 和 重 新 分 發 產 品, 以 支 持Microsoft 的 不 兼 容 環 境。

使 用com.ms 類:Microsoft 沒 有 使 用 標 準 的 包 命 名 約 定 - 逆 域 名 命 名 法, 而 使 用 了"ms.com", 它 恰 好 是Morgan Stanley 的 域 名。 應 該 鼓 勵 這 種 擴 充。 使 用 其 中 的 大 部 分 功 能 將 使 你 約 束 在Microsoft 環 境 中, 因 此 這 是 開 發 者 必 須 明 確 選 擇 的。 不 象 前 面 提 到 的 修 改, 這 些 功 能 不 會 意 外 地 使 用 到。 只 要Microsoft 專 用Java 程 序 被 正 確 地 標 志, 用 戶 不 會 有 問 題。

動 作 差 別: 應 用 程 序 編 程 接 口(API) 允 許 實 現 上 的 動 作 差 別。 這 些 差 別 中 有 些 是Microsoft 試 圖 減 少1.1 AWT 中 不 兼 容 而 做 的 修 改, 有 些 則 不 是, 而 有 些 帶 來 了 性 能 上 的 提 高。 如 果 開 發 者 依 賴 特 定 開 發 工 具, 而 這 種 工 具 存 在 問 題 的 話, 其 中 一 些 差 別 會 給 開 發 者 和 用 戶 帶 來 困 擾。
結 論
不 幸 的 是,Java 世 界 不 再 太 平。 隨 著Java 1.2 第 一beta 版 發 布 的 臨 近,Microsoft 表 示 將 不 支 持 其 中 的 部 分 功 能。 這 簡 直 就 是IBM 對Apple(PC 對MAC) 的 翻 版。 雖 然Microsoft 和Sun 為Java 工 具 箱 中 包 括 什 么 爭 論 不 休, 而 開 發 者 只 是 想 找 份 工 作 做。 誰 最 終 將 會 在 法 院 中 獲 勝, 時 間 會 說 明 一 切。 到 那 時, 開 發 者 需 要 理 解 爭 論 的 技 術 和 做 有 根 據 的 決 定。 除 非 這 兩 個 冤 家 重 新 走 到 一 起, 否 則 用 戶 和 開 發 者 就 象 夾 在 老 虎 鉗 中, 難 以 做 出 決 定。 雖 然 平 臺 間 的 絕 大 部 分 差 別 是 很 小 的, 但 是 畢 竟 存 在。 你 是 放 棄Java 的" 編 寫 一 次, 隨 處 運 行" 哲 學, 使 用Microsoft 虛 擬 機 的 專 用 擴 展, 還 是 跟 隨Sun 的100% 純Java 原 則 呢 ? 如 果 你 不 需 要JNI 和RMI, 則 很 容 易 選 擇。

感 謝 上 帝, 用Microsoft SDK 仍 然 能 創 建100% 純Java 解 決 方 案。 只 要 避 免 使 用 新 增 到 關 鍵Java 類 庫 中 的 類、 方 法、 變 量, 以 及 不 可 移 植 的com.ms 包, 你 還 能 創 建 跨 平 臺 的Java 程 序。 只 要 繞 開 增 加/ 省 略 的 動 作, 你 還 能 用Java 1.1 認 證 的 工 具, 如Sun JDK、JBuilder、VisualAge for Java 或Visual Cafe 2.0 創 建 可 以 在IE 4.0 上 運 行 的 程 序。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广平县| 临西县| 湘潭县| 田阳县| 秀山| 北碚区| 江山市| 秦皇岛市| 青川县| 通海县| 肃北| 铁岭县| 安化县| 宜黄县| 金寨县| 北海市| 阿尔山市| 思南县| 鹿邑县| 扶沟县| 门头沟区| 大余县| 昌平区| 锡林郭勒盟| 公安县| 虞城县| 荔波县| 萨嘎县| 菏泽市| 武鸣县| 喜德县| 嘉鱼县| 绍兴县| 光山县| 怀来县| 来宾市| 红原县| 兴义市| 临清市| 石渠县| 廉江市|