亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

克服J2SE 1.3 ~ 1.4不兼容問題 HK2000c

2019-11-18 13:12:57
字體:
來源:轉載
供稿:網友

  概要
  假如你要實現javaAPI中的一個,那么可能是件比較痛苦的事情。你經常會需要實現許多交叉依靠的接口。對新特性的需求促成了升級現有的JavaAPI,這就造成了提供這些API的供給商對他們的相關實現不斷的升級以維持相關功能。隨著這些API的升級更改越來越頻繁,API代碼的不兼容使你不得不分別維護新舊版本的代碼庫。這直接到導致了你維護成本和難度的增加。本文演示了解決此問題的技術,揭示了如何僅使用一個代碼庫編譯不同JavaAPI版本的代碼。
  
  現在非常多的API被加入到到Java的標準庫中,比如JDBC。這樣做的好處是,Java可選包在部署時不必被綁定到相關的部署應用中去。這些API由專門的專業開發小組實現,在實際的使用當中這些API變得越來越受歡迎,使用的深度及廣度也在不斷的增加。但是有時候對一些API升級會變得使一些類及方法不可用。開發小組寧愿讓這些API包成為可選組件而不是作為Java標準支持庫的形式來發布。但是一旦加入標準庫中的API包,就像是和用戶簽定了終生契約,想再成為可選包是不可能的。所以作為用戶的你,可能會忽然發現你一下子自己的代碼庫變成了不兼容的2個代碼庫,一個是使用新API的代碼庫,另一個是使用舊API的代碼庫。你可能會以為情況不像你想象的那樣糟糕。我這里舉一個簡單的例子。J2SE1.4中由于對JDBC中的一些API的升級使的java.sql.Connection 不能同時被1.3 及 1.4 版本編譯通過。你可能會碰到我這樣的困境:我可能需要實現java.sql.Connection這個接口,但是我的代碼需要同時通過1.3 及1.4 得編譯。但是我不想同時維護2個版本的代碼庫。所以我開始尋找更好的解決方法。
  
  假如你依靠于javac來編譯你的應用的話,那么很不幸,Java聞名的一次編寫,到處運行(WORA)并不包括WOCA(一次編寫,到處編譯^_^;)。
  
  不過別太沮喪,編碼的反射技巧以及編譯的Ant技巧是你能夠安然過關。我能夠僅僅使用一組Java文件以及Ant工具,就能使一個版本同時編譯在1.3 和1.4 版本下面。別急,在我結識解決辦法之前,讓我先具體的解釋一下問題的描述。
  
  可憐人的連接池(PS:Poor man's connection pool ,很有意思的一句話)
  兩年前,我的公司需要一個連接池,但是又不肯出錢買一個。當時并沒有什么免費的東東可以使用,所以我們自己寫了一個連接池。為了能更好的跟蹤在整個應用中連接的情況,我們寫了一個com.icentris.sql.ConnectionWrapper類,它實現了java.sql.Connection 接口以及其他的一些包裝類(實現了另外的一些的java.sql 接口)。這些包裝類僅僅是跟蹤我們應用中的數據庫使用,以及通過方法調用真正的數據庫資源。
  當J2SE1.4來的時候,我們自然而然的想到升級我們提供給客戶的應用,使這些應用的性能得到很多提升。當然,我們也需要保留1.3版本,因為有些客戶根本不需要升級到1.4。我們氣惱的發現,假如我們不修改,我們的ConnectionWrapper 以及其他JDBC封裝類根本通不過J2SE1.4的編譯。
  
  為了文章的簡明,我通過使用ConnectionWrapper 這個類來演示我對所有其他不能夠通過J2SE1.4的類所使用的技術。假如我按照新的API標準,那么我不得不添加幾個方法到ConnectionWrapper中去,接下來2個大問題擺在了面前:
  
  1.因為我的包裝類需要經歷方法調用,我將不得不調用在J2SE1.3 sql類中并不存在的方法。
  2.因為一些新的方法涉及到一些新出現的類,我將不得不在編譯中面對那些在J2SE1.3中并不存在的類。
  
  反射提供了援助
  一些代碼可以很方便的解釋第一個問題。但是我的ConnectionWrapper 封裝了java.sql.Connection , 所有的我的例子
  依靠于在構造方法中的變量 realConnection :
  
  PRivate java.sql.Connection realConnection = null;
  
  public ConnectionWrapper(java.sql.Connection connection) {
  realConnection = connection;
  }
  
  為了看清楚我怎么做到解決版本不兼容問題,讓我們仔細看一下setHoldability(int)(這個在J2SE1.4被聲明的新方法)
  public void setHoldability(int holdability) throws SQLException {
  realConnection.setHoldability( holdability );
  }
  
  很不幸,這個方法在J2SE1.3中顯然通不過編譯,這就陷入了2難的尷尬境地。為了解決這一情況,我假定setHoldability() 將只會在J2SE1.4
  下面被調用,所以我使用了反射機制來調用該方法。
  
  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);
  }
  }
  
  現在我有了setHoldability() 方法,因此能順利通過J2SE1.4的編譯。原理是我并不直接調用J2SE1.3中間java.sql.Connection并不存在的方法,
  而是轉為通過讓setHoldability調用callJava14Method這個通用方法來調用,然后在一個SQLException 里封裝所有的異常。這樣就達到我預期的效果。
  現在所有的在J2SE1.4中新方法都工作的很好,在J2SE1.3的老版本下也能順利編譯而且工作正?!,F在我來著手解決第二個問題。
  就是如何在應用中能夠找到一個方法能夠使用J2SE1.3中并不存在的新的類。
  
  Ant 是答案
  在J2SE1.4中,java.sql.Connection 依靠于一個新的類java.sql.Savepoint。因為這個類在java.sql 包中,所以你不可能把它加入到J2SE1.3中去。Java不答應任何的第三方擴展包加入它的核心包(java.* 以及 javax.* )中去。 因此挑戰來了,在J2SE1.4下調用這個新的java.sql.Savepoint 類,但同時需要代碼能夠在J2SE1.3下面得到編譯以及能夠運行。很簡單,不是嗎?所有回答"Yes"的人都會得到一個榛仁巧克力餅(PS:哈哈,我回答了,可是沒有:P)。至少現在我找到了答案,使問題變得很簡單了。
  首先我插入了下面一條有條件的import語句
  // Comment_next_line_to_compile_with_Java_1.3
  import java.sql.Savepoint;
  
  然后我找到了一個能夠在J2SE1.3下面注釋掉import的方法。非常簡單,使用如下Ant 語句就可以了:
  <replace>
  <replacetoken>Comment_next_line_for_Java_1.3
  </replacetoken>
  <replacevalue>Comment_next_line_for_Java_1.3
  //</replacevalue>
  </replace>
  
  這個Ant 的 replace 標簽 有好幾個標簽選項,在以后我給出的全部例子里有很多。在這里面最重要的是使用<replacevalue>來替換<replacetoken> 。
  在xml里面的意思是換行。在J2SE1.4下,沒什么會發生, 但是在J2SE1.3下面一個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中只要能編譯就可以了。我發現只要我有一個我自己的Savepoint 類在我的包中,我的代碼就能夠通過編譯,而且不用任何的import包。但是我又要同時在這條import 語句不被注釋的同時我自己的Savepoint類被忽略掉。因此我造了一個空的com.icentris.sql.Savepoint類,這個可能(除了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語句。因此這個Savepoint就被替換成了我這個包里面寫的一個空的Savepoint類。所以我現在就能加入任何引用到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];<

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲高清福利视频| 精品国产区一区二区三区在线观看| 久久久精品久久久| 亚洲日本中文字幕| 91chinesevideo永久地址| 欧美风情在线观看| 国产第一区电影| 日本精品久久久久影院| 日韩中文字幕不卡视频| 亚洲社区在线观看| 51色欧美片视频在线观看| 国语自产精品视频在线看抢先版图片| 欧美一级淫片播放口| 国产精品96久久久久久又黄又硬| 国产精品视频在线播放| 国模精品视频一区二区| 亚洲精品美女免费| 狠狠躁夜夜躁人人爽超碰91| 色多多国产成人永久免费网站| 亚洲成人a级网| 疯狂做受xxxx高潮欧美日本| 国产日韩欧美影视| 国产69精品99久久久久久宅男| 日韩性生活视频| 成人久久久久爱| 亚洲国产成人精品女人久久久| 亚洲美女激情视频| 国产精品激情av电影在线观看| 国产一区二区日韩精品欧美精品| 亚洲最新中文字幕| 精品小视频在线| 欧美韩日一区二区| 日韩av在线播放资源| 亚洲最大在线视频| 中文字幕精品在线| 国产精自产拍久久久久久蜜| 97视频在线观看视频免费视频| 国产精品视频在线播放| 国产精品99久久99久久久二8| 欧美日韩午夜激情| 国产日韩精品在线播放| 久久久噜噜噜久久中文字免| 欧美精品福利在线| 欧美成人激情图片网| 92福利视频午夜1000合集在线观看| 韩曰欧美视频免费观看| 久久夜色精品国产亚洲aⅴ| 欧美精品日韩三级| 国产欧亚日韩视频| 久久99国产综合精品女同| 国语自产精品视频在线看一大j8| 亚洲欧美一区二区激情| 国产91色在线|| 2019中文字幕在线| 欧美精品免费播放| 国产成人啪精品视频免费网| 国产91免费观看| 欧美激情网站在线观看| 九九精品视频在线观看| 亚洲人成五月天| 欧美美最猛性xxxxxx| 精品女同一区二区三区在线播放| 成人免费网站在线看| 久久香蕉国产线看观看网| 在线日韩第一页| 成人免费黄色网| 高跟丝袜一区二区三区| 91啪国产在线| 45www国产精品网站| 久久99国产精品自在自在app| 精品丝袜一区二区三区| 欧美亚洲一级片| 九九精品视频在线| 亚洲第一网站免费视频| 日本国产欧美一区二区三区| 久久久久久久999精品视频| 国产一区二区动漫| 国产精品亚洲精品| 久久国产精品影片| 精品国产乱码久久久久久虫虫漫画| 日韩一区二区欧美| 国产在线一区二区三区| 欧美日韩国产专区| 成人午夜一级二级三级| 亚洲裸体xxxx| 韩国日本不卡在线| 中文字幕日韩av综合精品| 国产精品久久久久久av福利| 欧美激情亚洲国产| 国产91在线高潮白浆在线观看| 91爱爱小视频k| 成人免费福利在线| 国产精品免费视频xxxx| 亚洲欧美国产一本综合首页| 国产精品r级在线| 国产一级揄自揄精品视频| 国产精品va在线| 欧美在线视频导航| 91免费综合在线| 亚洲免费一级电影| 亚洲人成网站999久久久综合| 日韩av一卡二卡| 97国产suv精品一区二区62| 国产在线999| 欧美裸体视频网站| 国产精品久久久久久久久久| 欧美精品九九久久| 91香蕉嫩草神马影院在线观看| 色99之美女主播在线视频| 欧美精品午夜视频| 国产成人精品一区二区在线| 久久香蕉国产线看观看av| 成人av番号网| 在线观看精品国产视频| 国产精品电影一区| 精品夜色国产国偷在线| 久久久av免费| 精品国产乱码久久久久久天美| 91精品国产自产91精品| 成人免费在线网址| 欧美一二三视频| 91精品久久久久久久久久| 国产精品海角社区在线观看| 欧洲美女免费图片一区| 国产精品视频午夜| 日本欧美精品在线| 亚洲黄色www| 久久精品小视频| 久久九九亚洲综合| 中文字幕欧美日韩精品| 国产不卡av在线免费观看| 国产精品久久在线观看| 久久久亚洲国产天美传媒修理工| 亚洲剧情一区二区| 欧美壮男野外gaytube| wwwwwwww亚洲| 日韩视频在线免费| 懂色av一区二区三区| 亚洲成人av片| 欧美精品精品精品精品免费| 久久久亚洲影院你懂的| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美高清自拍一区| 欧美精品福利视频| 欧美日韩成人网| 国产亚洲精品久久| 成人精品视频99在线观看免费| 538国产精品一区二区免费视频| 亚洲国产天堂久久国产91| 欧美国产第一页| 这里只有精品视频在线| 91亚洲精品久久久久久久久久久久| 国产成人精品一区二区| 欧美日韩一区二区精品| 久久国产精品电影| 色七七影院综合| 欧美日韩福利视频| 国产成人一区二区三区电影| 日韩美女视频免费看| 欧美激情亚洲激情| 欧美成人中文字幕在线| 久久免费视频在线观看| 欧美电影院免费观看| 国产精品啪视频|