知识大全 克服J2SE 1.3 ~ 1.4不兼容问题 HK2000c

Posted

篇首语:从某种意义来看,世间一切都是遇见,就像冷遇见暖,就有了雨;春遇见冬,就有了岁月;天遇见地,有了永恒;人遇见人,有了生命。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 克服J2SE 1.3 ~ 1.4不兼容问题 HK2000c相关的知识,希望对你有一定的参考价值。

克服J2SE 1.3 ~ 1.4不兼容问题 HK2000c  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   概要  如果你要实现JavaAPI中的一个 那么可能是件比较痛苦的事情 你经常会需要实现许多交叉依赖的接口 对新特性的需求促成了升级现有的JavaAPI 这就造成了提供这些API的供应商对他们的相关实现不断的升级以维持相关功能 随着这些API的升级更改越来越频繁 API代码的不兼容使你不得不分别维护新旧版本的代码库 这直接到导致了你维护成本和难度的增加 本文演示了解决此问题的技术 揭示了如何仅使用一个代码库编译不同JavaAPI版本的代码     现在非常多的API被加入到到Java的标准库中 比如JDBC 这样做的好处是 Java可选包在部署时不必被绑定到相关的部署应用中去 这些API由专门的专业开发小组实现 在实际的使用当中这些API变得越来越受欢迎 使用的深度及广度也在不断的增加 但是有时候对一些API升级会变得使一些类及方法不可用 开发小组宁愿让这些API包成为可选组件而不是作为Java标准支持库的形式来发布 但是一旦加入标准库中的API包 就像是和用户签定了终生契约 想再成为可选包是不可能的 所以作为用户的你 可能会突然发现你一下子自己的代码库变成了不兼容的 个代码库 一个是使用新API的代码库 另一个是使用旧API的代码库 你可能会以为情况不像你想象的那样糟糕 我这里举一个简单的例子 J SE 中由于对JDBC中的一些API的升级使的java sql Connection 不能同时被 及 版本编译通过 你可能会遇到我这样的困境 我可能需要实现java sql Connection这个接口 但是我的代码需要同时通过 及 得编译 但是我不想同时维护 个版本的代码库 所以我开始寻找更好的解决方法     如果你依赖于javac来编译你的应用的话 那么很不幸 Java著名的一次编写 到处运行(WORA)并不包括WOCA(一次编写 到处编译^_^;)     不过别太沮丧 编码的反射技巧以及编译的Ant技巧是你能够安然过关 我能够仅仅使用一组Java文件以及Ant工具 就能使一个版本同时编译在 和 版本下面 别急 在我结识解决办法之前 让我先详细的解释一下问题的描述     可怜人的连接池(PS:Poor man s connection pool 很有意思的一句话)  两年前 我的公司需要一个连接池 但是又不肯出钱买一个 当时并没有什么免费的东东可以使用 所以我们自己写了一个连接池 为了能更好的跟踪在整个应用中连接的情况 我们写了一个 icentris sql ConnectionWrapper类 它实现了java sql Connection 接口以及其他的一些包装类(实现了另外的一些的java sql 接口) 这些包装类仅仅是跟踪我们应用中的数据库使用 以及通过方法调用真正的数据库资源   当J SE 来的时候 我们自然而然的想到升级我们提供给客户的应用 使这些应用的性能得到很多提升 当然 我们也需要保留 版本 因为有些客户根本不需要升级到 我们气恼的发现 如果我们不修改 我们的ConnectionWrapper 以及其他JDBC封装类根本通不过J SE 的编译     为了文章的简明 我通过使用ConnectionWrapper 这个类来演示我对所有其他不能够通过J SE 的类所使用的技术 如果我按照新的API标准 那么我不得不添加几个方法到ConnectionWrapper中去 接下来 个大问题摆在了面前      因为我的包装类需要经历方法调用 我将不得不调用在J SE sql类中并不存在的方法    因为一些新的方法涉及到一些新出现的类 我将不得不在编译中面对那些在J SE 中并不存在的类      反射提供了援助  一些代码可以很方便的解释第一个问题 但是我的ConnectionWrapper 封装了java sql Connection 所有的我的例子  依赖于在构造方法中的变量 realConnection     private java sql Connection realConnection = null;    public ConnectionWrapper(java sql Connection connection)   realConnection = connection;      为了看清楚我怎么做到解决版本不兼容问题 让我们仔细看一下setHoldability(int)(这个在J SE 被声明的新方法)  public void setHoldability(int holdability) throws SQLException   realConnection setHoldability( holdability );      很不幸 这个方法在J SE 中显然通不过编译 这就陷入了 难的尴尬境地 为了解决这一情况 我假定setHoldability() 将只会在J SE   下面被调用 所以我使用了反射机制来调用该方法     public void setHoldability(int holdability) throws SQLException   Class[] argTypes = new Class[] Integer TYPE ;  Object[] args = new Object[] new Integer(holdability);  callJava Method( setHoldability realConnection argTypes args);      public static Object callJava Method(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() 方法 因此能顺利通过J SE 的编译 原理是我并不直接调用J SE 中间java sql Connection并不存在的方法   而是转为通过让setHoldability调用callJava Method这个通用方法来调用 然后在一个SQLException 里封装所有的异常 这样就达到我预期的效果   现在所有的在J SE 中新方法都工作的很好 在J SE 的老版本下也能顺利编译而且工作正常 现在我来着手解决第二个问题   就是如何在应用中能够找到一个方法能够使用J SE 中并不存在的新的类      Ant 是答案  在J SE 中 java sql Connection 依赖于一个新的类java sql Savepoint 因为这个类在java sql 包中 所以你不可能把它加入到J SE 中去 Java不允许任何的第三方扩展包加入它的核心包(java * 以及 javax * )中去 因此挑战来了 在J SE 下调用这个新的java sql Savepoint 类 但同时需要代码能够在J SE 下面得到编译以及能够运行 很简单 不是吗?所有回答 Yes 的人都会得到一个榛仁巧克力饼(PS:哈哈 我回答了 可是没有 P) 至少现在我找到了答案 使问题变得很简单了   首先我插入了下面一条有条件的import语句  // Comment_next_line_to_pile_with_Java_   import java sql Savepoint;    然后我找到了一个能够在J SE 下面注释掉import的方法 非常简单 使用如下Ant 语句就可以了   <replace>  <replacetoken>Comment_next_line_for_Java_   </replacetoken>  <replacevalue>Comment_next_line_for_Java_   //</replacevalue>  </replace>    这个Ant 的 replace 标签 有好几个标签选项 在以后我给出的全部例子里有很多 在这里面最重要的是使用<replacevalue>来替换<replacetoken>   在XML里面的意思是换行 在J SE 下 没什么会发生 但是在J SE 下面一个import声明被注释掉了   // Comment_next_line_to_pile_with_Java_   //import java sql Savepoint;    但是我在代码中Savepoint仍在使用public Savepoint setSavepoint(String name) throws SQLException 不过我只在J SE 使用这些方法类 在J SE 中只要能编译就可以了 我发现只要我有一个我自己的Savepoint 类在我的包中 我的代码就能够通过编译 而且不用任何的import包 但是我又要同时在这条import 语句不被注释的同时我自己的Savepoint类被忽略掉 因此我造了一个空的 icentris sql Savepoint类 这个可能(除了JavaDoc)是最短的有效类   package icentris sql;    /** Dummy class to allow ConnectionWrapper to implement java sql Connection  * and still pile under J SE and J SE When piled  * under J SE this class piles as a placeholder instead of the  * missing java sql Savepoint (not in J SE ) When piled  * under J SE this class is ignored and ConnectionWrapper uses the  * java sql Savepoint that is new in J SE   */  public class Savepoint     在J SE 下我能够正确的import java sql Savepoint类 而在J SE 下面Ant注释了这条import语句 因此这个Savepoint就被替换成了我这个包里面写的一个空的Savepoint类 所以我现在就能加入任何引用到Savepoint类的方法 同样的在这些新方法中使用刚才所说的反射方法   // Comment_next_line_to_pile_with_Java_   import java sql Savepoint;       public Savepoint setSavepoint() throws SQLException   Class[] argTypes = new Class[ ];  Object[] args = new Object[ ];< cha138/Article/program/Java/JSP/201311/19513

相关参考

知识大全 用J2SE 1.4 进行 Internet 安全编程(一)

用J2SE1.4进行Internet安全编程(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 用J2SE 1.4进行Internet安全编程(三)

用J2SE1.4进行Internet安全编程(三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 探讨 J2SE 1.4 发行版中的安全性变化

探讨J2SE1.4发行版中的安全性变化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  安全性是当

知识大全 DB2数据库代码页不兼容的问题的另类解决

DB2数据库代码页不兼容的问题的另类解决  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当发出命

玉米禾蓟马

形态:雌成虫体长1.3-1.4毫米,体灰褐色至黑褐色,头、胸、腹灰色部分不甚规则,头部在复眼前略呈角状突出;触角8节,第一节和第二节深棕色,第三节和第四节黄色,前胸背板宽大于长,前缘4根长鬃毛,排列连

玉米禾蓟马

形态:雌成虫体长1.3-1.4毫米,体灰褐色至黑褐色,头、胸、腹灰色部分不甚规则,头部在复眼前略呈角状突出;触角8节,第一节和第二节深棕色,第三节和第四节黄色,前胸背板宽大于长,前缘4根长鬃毛,排列连

知识大全 javascript解决innerText浏览器兼容问题

javascript解决innerText浏览器兼容问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 ie与火狐中常见的兼容问题

  documentformitem问题  ()现有问题  现有代码中存在许多documentformNameitem("itemName")这样的语句不能在Firefox(火狐)下运行  ()解决方

PLC在兼容性方面存在什么问题?

  与个人计算机相比,PLC的硬件、软件体系结构都是封闭的而不是开放的。在硬件方面,各厂家的CPU模块和I/O模块互不通用,通信网络和通信协议往往也是专用的。各种PLC的编程语言和指令系统的功能和表达

PLC在兼容性方面存在什么问题?

  与个人计算机相比,PLC的硬件、软件体系结构都是封闭的而不是开放的。在硬件方面,各厂家的CPU模块和I/O模块互不通用,通信网络和通信协议往往也是专用的。各种PLC的编程语言和指令系统的功能和表达