如何避免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
闽公网安备 35060202000074号