欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

克服J2SE1.3~1.4不兼容問題(轉(zhuǎn))

克服J2SE 1.3 ~ 1.4不兼容問題 (轉(zhuǎn))[@more@]

克服j2se 1.3 ~ 1.4不兼容問題
--從反射api和ANT獲得幫助



概要
  如果你要實(shí)現(xiàn)JavaAPI中的一個(gè),那么可能是件比較痛苦的事情。你經(jīng)常會(huì)需要實(shí)現(xiàn)許多交叉依賴的接口。對新特性的需求促成了升級(jí)現(xiàn)有的JavaAPI,這就造成了提供這些API的供應(yīng)商對他們的相關(guān)實(shí)現(xiàn)不斷的升級(jí)以維持相關(guān)功能。隨著這些API的升級(jí)更改越來越頻繁,API代碼的不兼容使你不得不分別維護(hù)新舊版本的代碼庫。這直接到導(dǎo)致了你維護(hù)成本和難度的增加。本文演示了解決此問題的技術(shù),揭示了如何僅使用一個(gè)代碼庫編譯不同JavaAPI版本的代碼。



  現(xiàn)在非常多的API被加入到到Java的標(biāo)準(zhǔn)庫中,比如JdbC。這樣做的好處是,Java可選包在部署時(shí)不必被綁定到相關(guān)的部署應(yīng)用中去。這些API由專門的專業(yè)開發(fā)小組實(shí)現(xiàn),在實(shí)際的使用當(dāng)中這些API變得越來越受歡迎,使用的深度及廣度也在不斷的增加。但是有時(shí)候?qū)σ恍〢PI升級(jí)會(huì)變得使一些類及方法不可用。開發(fā)小組寧愿讓這些API包成為可選組件而不是作為Java標(biāo)準(zhǔn)支持庫的形式來發(fā)布。但是一旦加入標(biāo)準(zhǔn)庫中的API包,就像是和用戶簽定了終生契約,想再成為可選包是不可能的。所以作為用戶的你,可能會(huì)突然發(fā)現(xiàn)你一下子自己的代碼庫變成了不兼容的2個(gè)代碼庫,一個(gè)是使用新API的代碼庫,另一個(gè)是使用舊API的代碼庫。你可能會(huì)以為情況不像你想象的那樣糟糕。我這里舉一個(gè)簡單的例子。J2SE1.4中由于對JDBC中的一些API的升級(jí)使的java.sql.Connection 不能同時(shí)被1.3 及 1.4 版本編譯通過。你可能會(huì)遇到我這樣的困境:我可能需要實(shí)現(xiàn)java.sql.Connection這個(gè)接口,但是我的代碼需要同時(shí)通過1.3 及1.4 得編譯。但是我不想同時(shí)維護(hù)2個(gè)版本的代碼庫。所以我開始尋找更好的解決方法。
  如果你依賴于javac來編譯你的應(yīng)用的話,那么很不幸,Java著名的一次編寫,到處運(yùn)行(WORA)并不包括WOCA(一次編寫,到處編譯^_^;)。
不過別太沮喪,編碼的反射技巧以及編譯的Ant技巧是你能夠安然過關(guān)。我能夠僅僅使用一組Java文件以及Ant工具,就能使一個(gè)版本同時(shí)編譯
在1.3 和1.4 版本下面。別急,在我結(jié)識(shí)解決辦法之前,讓我先詳細(xì)的解釋一下問題的描述。

可憐人的連接池(PS:Poor man's connection pool ,很有意思的一句話)
  兩年前,我的公司需要一個(gè)連接池,但是又不肯出錢買一個(gè)。當(dāng)時(shí)并沒有什么免費(fèi)的東東可以使用,所以我們自己寫了一個(gè)連接池。為了能更好的跟蹤在整個(gè)應(yīng)用中連接的情況,我們寫了一個(gè)com.icentris.sql.ConnectionWrapper類,它實(shí)現(xiàn)了java.sql.Connection 接口以及其他的一些包裝類(實(shí)現(xiàn)了另外的一些的java.sql 接口)。這些包裝類僅僅是跟蹤我們應(yīng)用中的數(shù)據(jù)庫使用,以及通過方法調(diào)用真正的
數(shù)據(jù)庫資源。
  當(dāng)J2SE1.4來的時(shí)候,我們自然而然的想到升級(jí)我們提供給客戶的應(yīng)用,使這些應(yīng)用的性能得到很多提升。當(dāng)然,我們也需要保留1.3版本,因?yàn)橛行┛蛻舾静恍枰?jí)到1.4。我們氣惱的發(fā)現(xiàn),如果我們不修改,我們的ConnectionWrapper 以及其他JDBC封裝類根本通不過J2SE1.4的編譯。
  為了文章的簡明,我通過使用ConnectionWrapper 這個(gè)類來演示我對所有其他不能夠通過J2SE1.4的類所使用的技術(shù)。如果我按照新的API標(biāo)準(zhǔn),那么我不得不添加幾個(gè)方法到ConnectionWrapper中去,接下來2個(gè)大問題擺在了面前:
1.因?yàn)槲业陌b類需要經(jīng)歷方法調(diào)用,我將不得不調(diào)用在J2SE1.3 sql類中并不存在的方法。
2.因?yàn)橐恍┬碌姆椒ㄉ婕暗揭恍┬鲁霈F(xiàn)的類,我將不得不在編譯中面對那些在J2SE1.3中并不存在的類。

反射提供了援助
一些代碼可以很方便的解釋第一個(gè)問題。但是我的ConnectionWrapper 封裝了java.sql.Connection , 所有的我的例子
依賴于在構(gòu)造方法中的變量 realConnection :

private java.sql.Connection realConnection = null;
 
  public ConnectionWrapper(java.sql.Connection connection) {
  realConnection = connection;
  }

  為了看清楚我怎么做到解決版本不兼容問題,讓我們仔細(xì)看一下setHoldability(int)(這個(gè)在J2SE1.4被聲明的新方法)
public void setHoldability(int holdability) throws SQLException {
  realConnection.setHoldability( holdability );
  }

  很不幸,這個(gè)方法在J2SE1.3中顯然通不過編譯,這就陷入了2難的尷尬境地。為了解決這一情況,我假定setHoldability() 將只會(huì)在J2SE1.4
下面被調(diào)用,所以我使用了反射機(jī)制來調(diào)用該方法。

public void setHoldability(int holdability) throws SQLException {
  Class[] argTypes = new Class[] { Integer.TYPE };
  object[] args = new Object[] {new Integer(holdability)};
  callJava14Method("setHoldability", realConnection, argTypes, args);
  }

  public static Object callJava14Method(String methodName, Object instance,
  Class[] argTypes, Object[] args)
  throws SQLException
  {
  try {
  Method method = instance.getClass().getMethod(methodName, argTypes);
  return method.invoke(instance, args );
  } catch (NoSuchMethodException e) {
  e.printStackTrace();
  throw new SQLException("Error Invoking method (" + methodName + "): "
  + e);
  } catch (IllegalAccessException e) {
  e.printStackTrace();
  throw new SQLException("Error Invoking method (" + methodName + "): "
  + e);
  } catch (InvocationTargetException e) {
  e.printStackTrace();
  throw new SQLException("Error Invoking method (" + methodName + "): "
  + e);
  }
  }

  現(xiàn)在我有了setHoldability() 方法,因此能順利通過J2SE1.4的編譯。原理是我并不直接調(diào)用J2SE1.3中間java.sql.Connection并不存在的方法,
而是轉(zhuǎn)為通過讓setHoldability調(diào)用callJava14Method這個(gè)通用方法來調(diào)用,然后在一個(gè)SQLException 里封裝所有的異常。這樣就達(dá)到我預(yù)期的效果。
現(xiàn)在所有的在J2SE1.4中新方法都工作的很好,在J2SE1.3的老版本下也能順利編譯而且工作正?!,F(xiàn)在我來著手解決第二個(gè)問題。
就是如何在應(yīng)用中能夠找到一個(gè)方法能夠使用J2SE1.3中并不存在的新的類。

Ant 是答案
在J2SE1.4中,java.sql.Connection 依賴于一個(gè)新的類java.sql.Savepoint。因?yàn)檫@個(gè)類在java.sql 包中,所以你不可能把它加入到J2SE1.3中去。Java不允許任何的第三方擴(kuò)展包加入它的核心包(java.* 以及 javax.* )中去。 因此挑戰(zhàn)來了,在J2SE1.4下調(diào)用這個(gè)新的java.sql.Savepoint 類,但同時(shí)需要代碼能夠在J2SE1.3下面得到編譯以及能夠運(yùn)行。很簡單,不是嗎?所有回答"Yes"的人都會(huì)得到一個(gè)榛仁巧克力餅(PS:哈哈,我回答了,可是沒有:P)。至少現(xiàn)在我找到了答案,使問題變得很簡單了。
  首先我插入了下面一條有條件的import語句
// Comment_next_line_to_compile_with_Java_1.3
  import java.sql.Savepoint;

  然后我找到了一個(gè)能夠在J2SE1.3下面注釋掉import的方法。非常簡單,使用如下Ant 語句就可以了:

  Comment_next_line_for_Java_1.3
  Comment_next_line_for_Java_1.3 //
 

  這個(gè)Ant 的 replace 標(biāo)簽 有好幾個(gè)標(biāo)簽選項(xiàng),在以后我給出的全部例子里有很多。在這里面最重要的是使用來替換 。 在XML里面的意思是換行。在J2SE1.4下,沒什么會(huì)發(fā)生, 但是在J2SE1.3下面一個(gè)import聲明被注釋掉了。
// Comment_next_line_to_compile_with_Java_1.3
  //import java.sql.Savepoint;

  但是我在代碼中Savepoint仍在使用public Savepoint setSavepoint(String name) throws SQLException { . . .}。不過我只在J2SE1.4使用這些方法類,在J2SE1.3中只要能編譯就可以了。我發(fā)現(xiàn)只要我有一個(gè)我自己的Savepoint 類在我的包中,我的代碼就能夠通過編譯,而且不用任何的import包。但是我又要同時(shí)在這條import 語句不被注釋的同時(shí)我自己的Savepoint類被忽略掉。因此我造了一個(gè)空的com.icentris.sql.Savepoint類,這個(gè)可能(除了JavaDoc)是最短的有效類:
package com.icentris.sql;

  /** Dummy class to allow ConnectionWrapper to implement java.sql.Connection
  * and still compile under J2SE 1.3 and J2SE 1.4. When compiled
  * under J2SE 1.3, this class compiles as a placeholder instead of the
  * missing java.sql.Savepoint (not in J2SE 1.3).  When compiled
  * under J2SE 1.4, this class is ignored and ConnectionWrapper uses the
  * java.sql.Savepoint that is new in J2SE 1.4.
  */
  public class Savepoint {}

  在J2SE1.4下我能夠正確的import java.sql.Savepoint類,而在J2SE1.3下面Ant注釋了這條import語句。因此這個(gè)Savepoint就被替換成了我這個(gè)包里面寫的一個(gè)空的Savepoint類。所以我現(xiàn)在就能加入任何引用到Savepoint類的方法,同樣的在這些新方法中使用剛才所說的反射方法。
// Comment_next_line_to_compile_with_Java_1.3
  import java.sql.Savepoint;

  . . .
  public Savepoint setSavepoint() throws SQLException {
  Class[] argTypes = new Class[0];
  Object[] args = new Object[0];
  return (Savepoint) callJava14Method("setSavepoint", realConnection,
  argTypes, args);
  }

  public Savepoint setSavepoint(String name) throws SQLException {
  Class[] argTypes = new Class[] { String.class };
  Object[] args = new Object[] { name };
  return (Savepoint) callJava14Method("setSavepoint", realConnection,
  argTypes, args);
  }

  public void rollback(Savepoint savepoint) throws SQLException {
  Class[] argTypes = new Class[] { Savepoint.class };
  Object[] args = new Object[] { savepoint };
  callJava14Method("rollback", realConnection, argTypes, args);
  }

  public void releaseSavepoint(Savepoint savepoint) throws SQLException {
  Class[] argTypes = new Class[] { Savepoint.class };
  Object[] args = new Object[] { savepoint };
  callJava14Method("releaseSavepoint", realConnection, argTypes, args);
  }

  現(xiàn)在我所要做的就是能夠使Ant 識(shí)別 J2SE1.3版,然后能夠使這條import 語句被注釋掉。

 
 
 
 
 
 
 

 

 

 
 

    name="isJava13">
 
 
 
 

 

    name="doJava13Tweaks" depends="isJava13" if="isJava13">
 
 
 
  Comment_next_line_for_Java_1.3
  Comment_next_line_for_Java_1.3 //
 

 

 
 
 
  Comment_next_line_for_Java_1.3 //
  Comment_next_line_for_Java_1.3
 

 

  注意編譯目標(biāo)在調(diào)用doJava13Tweaks的前后都調(diào)用了undoJava13Tweaks。如果萬一javac編譯失敗的話,我們可以恢復(fù)以前的編譯版本。

你沒有必要同時(shí)維護(hù)2個(gè)應(yīng)用實(shí)現(xiàn)
  對于Java來說,新的API升級(jí)所帶來的新的方法以及新的類/接口并不是新鮮事。一般而言,加入的新方法以及新的類的同時(shí),會(huì)考慮到向上兼容的問題來照顧老API用戶。但是當(dāng)升級(jí)的API屬于Java核心包內(nèi)時(shí),就會(huì)很麻煩。因?yàn)镴ava不允許對這些核心包的任何的外在更改或者是增加。通常這會(huì)引起針對不同版本API而維護(hù)不同版本代碼樹的需要。但是,就像上面的例子所演示的那樣,你只要維護(hù)一棵代碼樹就能夠在不同的版本的API下,編譯運(yùn)行。這個(gè)反射的API允許你調(diào)用并不存在的方法,而Ant能通過識(shí)別不同的Java編譯版本而對相應(yīng)的import包進(jìn)行調(diào)整。雖然上面的所舉的例子僅僅是一個(gè)簡單的演示,但是在實(shí)際工作當(dāng)中,利用這些簡單的技術(shù),解決了許多J2SE1.4和J2SE1.3的版本問題。我相信通過這些技術(shù),你可以在頻繁的Java版本升級(jí)中不必為同時(shí)維護(hù)兩棵代碼庫而煩惱。

創(chuàng)新互聯(lián)公司擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、移動(dòng)服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、成都做商城網(wǎng)站、政府網(wǎng)站等各類型客戶群體,為全球成百上千企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。


關(guān)于作者:
Sam Mefford是iCentris的首席架構(gòu)設(shè)計(jì)師。對于系統(tǒng)的兼容性重視程度,Sam Mefford是放在第一位的。他帶領(lǐng)的團(tuán)隊(duì)致力于使用一個(gè)代碼庫
向眾多的客戶公司提供應(yīng)用發(fā)布方案。這些部署方案使用的應(yīng)用服務(wù)器有tomcat,WEBLOGIC, Resin, Orion以及 websphere;在數(shù)據(jù)庫方面有
ORACLE,PostgreSQL, MySQL,以及 InfoRmix;以及多個(gè)Java運(yùn)行期環(huán)境。

譯者: SpikeWang (CSDN ID:hk2000c)

東華大學(xué)計(jì)算機(jī)系畢業(yè),現(xiàn)在同濟(jì)大學(xué)攻讀軟件工程碩士學(xué)位。致力于J2EE方面的企業(yè)級(jí)應(yīng)用開發(fā)以及研究工作。


About Copyright:
原文章版權(quán)屬于作者 Sam Mefford
譯文版權(quán)屬于譯者及原文作者共同所有,歡迎轉(zhuǎn)載,但要注上譯者及原文作者。


參考資源:
The API for java.sql.Connection (J2SE 1.3):
http://java.sun.com/j2se/1.3/docs/api/java/sql/Connection.html

The API for java.sql.Connection (J2SE 1.4):
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Connection.html

The JDBC API:
http://java.sun.com/products/jdbc/

Java Core Reflection參考概要:
ide/reflection/spec/java-reflectionTOC.doc.html">http://java.sun.com/j2se/1.3/docs/guide/reflection/spec/java-reflectionTOC.doc.html

the Reflection API指南:
http://java.sun.com/docs/books/tutorial/reflect/

The Javadoc (java.lang.reflect):
http://java.sun.com/j2se/1.3/docs/api/java/lang/reflect/package-summary.html


分享名稱:克服J2SE1.3~1.4不兼容問題(轉(zhuǎn))
標(biāo)題來源:http://aaarwkj.com/article40/gjdseo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、電子商務(wù)、自適應(yīng)網(wǎng)站、App開發(fā)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
中文字幕成人在线电影| 国产av超爽剧情系列| 国产有码视频一区二区三区| 中文字幕乱码日韩一区| 欧美高清一区二区三区不卡| 日韩女优中文字幕在线播放| 欧美一区二区三区四区久久 | 伊人久久亚洲精品综合| 国产传媒网约在线观看| av天堂黄色在线观看| 国产中文字幕精品在线观看| 日本束缚人妻一区二区三区| 欧美日本午夜福利在线观看 | 欧美大片在线观看高清| 亚洲最大黄色免费在线观看| 日本的一级片一区二区| 亚洲理论在线观看电影| 精品人妻系列一区二区| 成年人的黄色大片网站| 18岁以下禁看视频网站| 欧美 日本国产一区| 很黄很刺激的视频中文字幕| 999热这里只有精品视频| 午夜少妇伦理一区二区| 亚洲成人久久久久久久| 91青青草原免费观看| 日韩精品一区二区国产| 日韩高清中文字幕在线| 超碰91人人在线青青草| 日本一区二区不卡视频在线播放| av天堂中文一区二区三区| 中文字幕国产精品经典三级| 欧美日韩精品不卡在线播放| 精品人妻va人妻中文字幕麻豆| 熟女人妻丰满视频中文字幕| 最新日韩欧美一区二区| 日韩免费高清不卡视频| 成人爱爱视频在线免费观看| 免费在线观看美女av| 亚洲国产欧美一区三区成人| 88国产精品久久久久久|