| |
如何避免microsoft非标准javasdk的潜在危险 我分析了类,遇到了七个方面的问题。如果要用microsoft java sdk开发在其他java1.1认证的环境中可以运行的应用,应该特别注意这些问题,它们是: 1.新类 2.新方法 3.新变量 4.更改的接口 5.com.ms包 6.省略的方法 7.动作差别
baratz在sun宣布其起诉时用"欺骗"一词是因为sdk中所带的关于java类的文档没有提到这些修改。要发现它们,必须用sdk所带的classvue工具或者人工地读源代码。最好使用classvue,因为sdk提供的源代码可能并不是产生类的文件,对不熟悉classvue的人,等价的工具是sunsdk提供的类文件内部检查器javap。
以下是一张sdk中所有修改的清单,但是也有可能有疏漏。这里提到的所有修改都在java.lang、java.io、java.awt、java.util和java.security包或子包中,每个包的修改如下:
java.lang:新方法、新变量 java.io:省略方法 java.awt:新类、新方法、新变量 java.util:新方法、新变量 java.security:修改接口 新类 首先,microsoft在其javasdk系统包中增加了新的类、方法和变量。所有在完全修饰名中以java.*开头的叫做系统包或者核心javaapi。十六个新类加入到了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程序,否则就应该避免使用这些方法。除此之外还有三个新的实例变量和为数不少的国际化地区变量。 加入到javaapi中的实例变量类新变量 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 l99vhuanian mexican newzealand norwegian norwegian_nynorsk polish portugese romanian russian serbian simplified_chinese_vertical singapore slovakian slovenian south_africa spanish spanish_modern swedish swiss thai trad99vional_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
|
|