鍦↗ava涓紝String.getBytes(String decode)鏂規硶浼氭牴鎹寚瀹氱殑decode緙栫爜榪斿洖鏌愬瓧絎︿覆鍦ㄨ緙栫爜涓嬬殑byte鏁扮粍琛ㄧず錛屽
byte[] b_gbk = "涓?.getBytes("GBK");
byte[] b_utf8 = "涓?.getBytes("UTF-8");
byte[] b_iso88591 = "涓?.getBytes("ISO8859-1");
灝嗗垎鍒繑鍥?#8220;涓?#8221;榪欎釜姹夊瓧鍦℅BK銆乁TF-8鍜孖SO8859-1緙栫爜涓嬬殑byte鏁扮粍琛ㄧず錛屾鏃禸_gbk鐨勯暱搴︿負2錛宐_utf8鐨勯暱搴︿負3錛宐_iso88591鐨勯暱搴︿負1銆?/p>
鑰屼笌getBytes鐩稿鐨勶紝鍙互閫氳繃new String(byte[], decode)鐨勬柟寮忔潵榪樺師榪欎釜“涓?#8221;瀛楁椂錛岃繖涓猲ew String(byte[], decode)瀹為檯鏄嬌鐢╠ecode鎸囧畾鐨勭紪鐮佹潵灝哹yte[]瑙f瀽鎴愬瓧絎︿覆銆?/p>
String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");
閫氳繃鎵撳嵃s_gbk銆乻_utf8鍜宻_iso88591錛屼細鍙戠幇錛宻_gbk鍜宻_utf8閮芥槸“涓?#8221;錛岃屽彧鏈塻_iso88591鏄竴涓笉璁よ瘑 鐨勫瓧絎︼紝涓轟粈涔堜嬌鐢↖SO8859-1緙栫爜鍐嶇粍鍚堜箣鍚庯紝鏃犳硶榪樺師“涓?#8221;瀛楀憿錛屽叾瀹炲師鍥犲緢綆鍗曪紝鍥犱負ISO8859-1緙栫爜鐨勭紪鐮佽〃涓紝鏍規湰灝辨病鏈夊寘鍚眽瀛? 瀛楃錛屽綋鐒朵篃灝辨棤娉曢氳繃"涓?.getBytes("ISO8859-1");鏉ュ緱鍒版紜殑“涓?#8221;瀛楀湪ISO8859-1涓殑緙栫爜鍊間簡錛屾墍浠ュ啀閫氳繃new String()鏉ヨ繕鍘熷氨鏃犱粠璋堣搗浜嗐?/p>
鍥犳錛岄氳繃String.getBytes(String decode)鏂規硶鏉ュ緱鍒癰yte[]鏃訛紝涓瀹氳紜畾decode鐨勭紪鐮佽〃涓‘瀹炲瓨鍦⊿tring琛ㄧず鐨勭爜鍊鹼紝榪欐牱寰楀埌鐨刡yte[]鏁扮粍鎵嶈兘姝g‘琚繕鍘熴?/p>
鏈夋椂鍊欙紝涓轟簡璁╀腑鏂囧瓧絎﹂傚簲鏌愪簺鐗規畩瑕佹眰錛堝http header澶磋姹傚叾鍐呭蹇呴』涓篿so8859-1緙栫爜錛夛紝鍙兘浼氶氳繃灝嗕腑鏂囧瓧絎︽寜鐓у瓧鑺傛柟寮忔潵緙栫爜鐨勬儏鍐碉紝濡?/p>
String s_iso88591 = new
String("涓?.getBytes("UTF-8"),"ISO8859-1")錛岃繖鏍峰緱鍒扮殑s_iso8859-1瀛楃涓插疄闄呮槸涓変釜鍦?
ISO8859-1涓殑瀛楃錛屽湪灝嗚繖浜涘瓧絎︿紶閫掑埌鐩殑鍦板悗錛岀洰鐨勫湴紼嬪簭鍐嶉氳繃鐩稿弽鐨勬柟寮廠tring s_utf8 = new
String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")鏉ュ緱鍒版紜殑涓枃姹夊瓧“涓?#8221;銆傝繖鏍峰氨鏃繚璇佷簡閬靛畧鍗?
璁瀹氥佷篃鏀寔涓枃銆?/p>
媯鏌ヨ繖涓被鏈夋病鏈夎瑁呰澆榪囷紝濡傛灉宸茬粡瑁呰澆榪囷紝鍒欑洿鎺ヨ繑鍥烇紱
璋冪敤鐖禖lassloader鍘昏杞界被錛屽鏋滆杞芥垚鍔熺洿鎺ヨ繑鍥烇紱
璋冪敤鑷韓鐨勮杞界被鐨勬柟娉曪紝濡傛灉瑁呰澆鎴愬姛鐩存帴榪斿洖錛?/span>
涓婅堪鎵鏈夋楠ら兘娌℃湁鎴愬姛瑁呰澆鍒扮被錛屾姏鍑篊lassNotFoundException錛?/span>
姣忎竴灞傛鐨凜lassloader閮介噸澶嶄笂榪板姩浣溿?/span>
綆鍗曡錛屽綋Classloader閾句笂鐨勬煇涓Classloader鏀跺埌綾昏杞借姹傛椂錛屼細鎸夐『搴忓悜涓婅闂叾鎵鏈夌埗鑺傜偣錛岀洿鑷蟲渶欏剁錛圔ootstrapClassLoader錛夛紝浠諱綍涓涓妭鐐規垚鍔熷彈鐞嗕簡姝よ姹傦紝鍒欒繑鍥烇紝濡傛灉鎵鏈夌埗鑺傜偣閮戒笉鑳藉彈鐞嗭紝榪欐椂鍊欐墠鐢辮璇鋒眰鐨凜lassloader鑷韓鏉ヨ杞借繖涓被錛屽鏋滀粛鐒朵笉鑳借杞斤紝鍒欐姏鍑哄紓甯搞?br />
綾昏杞界殑鏂瑰紡
綾昏杞界殑鏂瑰紡涓昏鏈変袱縐嶏細鏄懼紡鐨勫拰闅愬紡鐨勩?/span>
鏄懼紡綾昏杞?/span>
鍙戠敓鍦ㄤ嬌鐢ㄤ互涓嬫柟娉曡皟鐢ㄨ繘琛岃杞界被鐨勬椂鍊欙細
ClassLoader.loadClass()錛堜嬌鐢ㄦ寚瀹氱殑Classloader榪涜瑁呰澆錛?/span>
Class.forName()錛堜嬌鐢ㄥ綋鍓嶇被鐨凜aller Classloader榪涜瑁呰澆錛?/span>
褰撹皟鐢ㄤ笂榪版柟娉曠殑鏃跺欙紝鎸囧畾鐨凜lass錛堜互綾誨悕涓哄弬鏁幫級鐢盋lassloader瑁呭叆銆?span style="color: red">榪欎袱涓柟娉曠殑琛屼負鏈夎交寰殑鍖哄埆錛孋lass.forName()鍦ㄧ被瑁呰澆瀹屾垚鍚庯紝浼氬綾昏繘琛屽垵濮嬪寲錛岃孋lassLoader.loadClass()鍙礋璐h杞界被銆?/span>
闅愬紡綾昏杞?/span>
鍙戠敓鍦ㄧ敱浜庡紩鐢ㄣ佸疄渚嬪寲鎴栫戶鎵垮鑷撮渶瑕佽杞界被鐨勬椂鍊欍傞殣寮忕被瑁呰澆鏄湪騫曞悗鍚姩鐨勶紝JVM浼氳В鏋愬繀瑕佺殑寮曠敤騫惰杞界被銆?/span>
綾葷殑瑁呰澆閫氬父緇勫悎浜嗘樉寮忓拰闅愬紡涓ょ鏂瑰紡銆備緥濡傦紝Classloader鍙兘鍏堟樉寮忓湴瑁呰澆涓涓被錛岀劧鍚庡啀闅愬紡鍦拌杞藉畠寮曠敤鐨勫叾瀹冪被銆?br />
涓涓熀鏈殑Classloader鐨勫眰嬈$粨鏋?br />
涓婂浘鏄劇ず浜嗕竴涓熀鏈殑Classloader鐨勫眰嬈$粨鏋勩?span style="color: red; background-color: #ffff00">鍦ㄧ粰瀹氬眰嬈′笂鐨凜lassloader涓嶈兘寮曠敤浠諱綍灞傛浣庝簬瀹冪殑Classloader錛屽彟澶栵紝瀹冪殑瀛怌lassloader瑁呰澆鐨勭被瀵逛簬鍏舵槸涓嶅彲瑙佺殑銆?/span>鍦ㄤ笂鍥句腑錛屽鏋淔oo.class鏄敱ClassLoaderB瑁呰澆鐨勶紝騫朵笖Foo.class渚濊禆浜嶣ar.class錛岄偅涔圔ar.class蹇呴』鐢盋lassLoaderA鎴朆瑁呰澆銆傚鏋淏ar.class鍙槸瀵笴lassLoaderC鍜孌鍙錛岄偅涔堝皢浼氬彂鐢烠lassNotFoundException鎴栬匩oClassDefFoundError寮傚父銆?/span>
濡傛灉Bar.class鍒嗗埆瀵逛簬涓や釜騫崇駭鐨凜lassloader鍙錛堜緥濡侰鍜孌錛夛紝浣嗗浜庡畠浠殑鐖禖lassloader涓嶅彲瑙侊紝閭d箞褰撶被瑁呰澆璇鋒眰鍙戦佸埌榪欎袱涓狢lassloader鏃訛紝姣忎竴涓狢lassloader浼氳杞借嚜宸辯増鏈殑綾匯侰lassLoaderC瑁呰澆鐨凚ar.class鐨勫疄渚嬪皢涓嶅吋瀹逛簬ClassLoaderD瑁呰澆鐨凚ar.class鐨勫疄渚嬨傚鏋滃Classloader鐨勫眰嬈$粨鏋勪笉浜嗚В錛岃瘯鍥句嬌鐢ㄧ敱ClassLoaderC瑁呰澆鐨勭被鍘婚犲瀷涓涓狢lassLoaderD瑁呰澆鐨凚ar.class鐨勫疄渚嬶紝鍒欎細鍙戠敓閫犲瀷澶辮觸錛圕lassCastException錛夈?/span>
鍩烘湰鐨凜lassloader
鏈鍩烘湰鐨凜lassloader鏄疊ootstrap Classloader鍜孲ystem Classloader錛堜篃鏈変漢縐頒箣涓篈ppClassLoader錛夛紝鍙鍐欒繃java紼嬪簭錛岄兘浼氱敤鍒拌繖涓や釜Classloader銆?/span>
Bootstrap Classloader
榪欎釜Classloader瑁呰澆Java铏氭嫙鏈烘彁渚涚殑鍩烘湰榪愯鏃跺埢綾伙紙$JAVA_HOME/jre/lib錛夛紝榪樺寘鎷斁緗湪緋葷粺鎵╁睍鐩綍錛?JAVA_HOME/jre/lib/ext錛夊唴鐨凧AR鏂囦歡涓殑綾匯傝繖涓狢lassloader鏄痡ava紼嬪簭鏈欏跺眰鐨凜lassloader錛屽彧鏈夊畠娌℃湁鐖禖lassloader銆傚鏋滀綘灝嗕竴涓嚜宸卞啓鐨勭被鎴栫涓夋柟jar鍖呮斁榪?JAVA_HOME/jre/lib/ext鐩綍涓紝閭d箞瀹冨皢琚獴ootstrap Classloader瑁呰澆銆?/span>
System Classloader
System Classloader閫氬父璐熻矗瑁呰澆緋葷粺鐜鍙橀噺CLASSPATH涓緗殑綾匯傜敱System Classloader瑁呰澆鐨勭被瀵逛簬Apusic鏈嶅姟鍣ㄥ唴閮ㄧ殑綾誨拰閮ㄧ講鍦ˋpusic鏈嶅姟鍣ㄤ笂鐨凧2EE搴旂敤錛堥氬父鎵撳寘鎴恊ar錛夐兘鏄彲瑙佺殑銆?APUSIC_HOME%/lib鐩綍涓嬬殑jar鏂囦歡鏄疉pusic搴旂敤鏈嶅姟鍣ㄧ殑鏍稿績綾伙紝涓鑸妸榪欎簺jar鏂囦歡閮藉姞鍦ㄧ郴緇烠LASSPATH涓傚彟澶栵紝涓浜涘叕鐢ㄧ被涔熷彲浠ュ姞鍦ㄧ郴緇烠LASSPATH涓紝濡侸DBC椹卞姩紼嬪簭絳夈?/span>
Caller Classloader
Caller Classloader鎸囩殑鏄綋鍓嶆墍鍦ㄧ殑綾昏杞芥椂浣跨敤鐨凜lassloader錛屽畠鍙兘鏄疭ystem Classloader錛屼篃鍙兘鏄竴涓嚜瀹氫箟鐨凜lassloader錛岃繖閲岋紝鎴戜滑閮界О涔嬩負Caller Classloader銆傛垜浠彲浠ラ氳繃getClass().getClassLoader()鏉ュ緱鍒癈aller Classloader銆備緥濡傦紝瀛樺湪A綾伙紝鏄AClassLoader鎵鍔犺澆錛孉.class.getClassLoader()涓篈ClassLoader鐨勫疄渚嬶紝瀹冨氨鏄疉.class鐨凜aller Classloader銆?/span>
濡傛灉鍦ˋ綾諱腑浣跨敤new鍏抽敭瀛楋紝鎴栬匔lass.forName(String className)鍜孋lass.getResource(String resourceName)鏂規硶錛岄偅涔堣繖鏃朵篃鏄嬌鐢–aller Classloader鏉ヨ杞界被鍜岃祫婧愩傛瘮濡傚湪A綾諱腑鍒濆鍖朆綾伙細
/**
* A.java
*/
...
public void foo() {
B b = new B();
b.setName("b");
}
閭d箞錛孊綾葷敱褰撳墠Classloader錛屼篃灝辨槸AClassloader瑁呰澆銆傚悓鏍風殑錛屼慨鏀逛笂榪扮殑foo鏂規硶錛屽叾瀹炵幇鏀逛負錛?/span>
鏈緇堣幏鍙栧埌鐨刢lazz錛屼篃鏄敱AClassLoader鎵瑁呰澆銆?/span>
閭d箞錛屽浣曚嬌鐢ㄦ寚瀹氱殑Classloader鍘誨畬鎴愮被鍜岃祫婧愮殑瑁呰澆鍛紵鎴栬呰錛屽綋闇瑕佸幓瀹炰緥鍖栦竴涓狢aller Classloader鍜屽畠鐨勭埗Classloader閮戒笉鑳借杞界殑綾繪椂錛屾庝箞鍔炲憿錛?/span>
涓涓緢鍏稿瀷鐨勪緥瀛愭槸JAXP錛屽綋浣跨敤xerces鐨凷AX瀹炵幇鏃訛紝鎴戜滑棣栧厛闇瑕侀氳繃rt.jar涓殑javax.xml.parsers.SAXParserFactory.getInstance()寰楀埌xercesImpl.jar涓殑org.apache.xerces.jaxp.SAXParserFactoryImpl鐨勫疄渚嬨傜敱浜嶫AXP鐨勬鏋舵帴鍙g殑class浣嶄簬JAVA_HOME/lib/rt.jar涓紝鐢盉ootstrap Classloader瑁呰澆錛屽浜嶤lassloader灞傛緇撴瀯涓殑鏈欏跺眰錛岃寈ercesImpl.jar鐢變綆灞傜殑Classloader瑁呰澆錛屼篃灝辨槸璇碨AXParserFactoryImpl鏄湪SAXParserFactory涓疄渚嬪寲鐨勶紝濡傚墠鎵榪幫紝浣跨敤SAXParserFactory鐨凜aller Classloader(榪欓噷鏄疊ootstrap Classloader)鏄畬鎴愪笉浜嗚繖涓換鍔$殑銆?/span>
榪欐椂錛屾垜浠氨闇瑕佷簡瑙d竴涓嬬嚎紼嬩笂涓嬫枃Classloader浜?br />
綰跨▼涓婁笅鏂嘋lassloader
姣忎釜綰跨▼閮芥湁涓涓叧鑱旂殑涓婁笅鏂嘋lassloader銆傚鏋滀嬌鐢╪ew Thread()鏂瑰紡鐢熸垚鏂扮殑綰跨▼錛屾柊綰跨▼灝嗙戶鎵垮叾鐖剁嚎紼嬬殑涓婁笅鏂嘋lassloader銆傚鏋滅▼搴忓綰跨▼涓婁笅鏂嘋lassloader娌℃湁浠諱綍鏀瑰姩鐨勮瘽錛岀▼搴忎腑鎵鏈夌殑綰跨▼灝嗛兘浣跨敤System Classloader浣滀負涓婁笅鏂嘋lassloader銆?/span>
褰撲嬌鐢═hread.currentThread().setContextClassLoader(classloader)鏃訛紝綰跨▼涓婁笅鏂嘋lassloader灝卞彉鎴愪簡鎸囧畾鐨凜lassloader浜嗐傛鏃訛紝鍦ㄦ湰綰跨▼鐨勪換鎰忎竴澶勫湴鏂癸紝璋冪敤Thread.currentThread().getContextClassLoader()錛岄兘鍙互寰楀埌鍓嶉潰璁劇疆鐨凜lassloader銆?/span>
鍥炲埌JAXP鐨勪緥瀛愶紝鍋囪xercesImpl.jar鍙湁AClassLoader鑳借杞斤紝鐜板湪A.class鍐呴儴瑕佷嬌鐢↗AXP錛屼絾鏄疉.class鍗翠笉鏄敱AClassLoader鎴栬呭畠鐨勫瓙Classloader瑁呰澆鐨勶紝閭d箞鍦ˋ.class涓紝搴旇榪欐牱鍐欐墠鑳芥紜緱鍒皒ercesImpl鐨勫疄鐜幫細
AClassLoader aClassLoader = new AClassLoader(parent);
鏈榪戠湅浠g爜涓鐩寸鍒拌繖涓被錛屽厛鍋氫竴涓葷粨銆?br />
鍏堢湅PropertyChangeSupport綾葷殑瀹樻柟鏂囨。瑙i噴錛?br />
This is a utility class that can be used by beans that support bound properties. You can use an instance of this class as a member field of your bean and delegate various work to it.
1錛庡叧鑱斿睘鎬?br />
鍦↗avaBean鐨勮璁′腑錛屾寜鐓у睘鎬х殑涓嶅悓浣滅敤鍙堢粏鍒嗕負鍥涚被錛氬崟鍊煎睘鎬с佺儲寮曞睘鎬с佸叧鑱斿睘鎬с侀檺鍒跺睘鎬с傚叧鑱斿睘鎬э紝涔熺О涔嬩負緇戝畾灞炴с傜粦瀹氬睘鎬т細鍦ㄥ睘鎬у煎彂鐢熷彉鍖栨椂錛岄氱煡鎵鏈夌浉鍏崇殑鐩戝惉鍣ㄣ備負浜嗗疄鐜頒竴涓粦瀹氬睘鎬э紝蹇呴』瀹炵幇涓や釜鏈哄埗銆?br />
1錛? 鏃犺浣曟椂錛屽彧瑕佸睘鎬х殑鍊煎彂鐢熷彉鍖栵紝璇ean蹇呴』鍙戦佷竴涓狿ropertyChange浜嬩歡緇欐墍鏈夊凡娉ㄥ唽鐨勭洃鍚櫒銆?br />
2錛? 涓轟簡浣跨洃鍚櫒鑳藉娉ㄥ唽錛宐ean蹇呴』瀹炵幇浠ヤ笅涓や釜鏂規硶錛歷oid addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangerListener(PropertyChangerListener listener);
2錛庝嬌鐢≒ropertyChangeSupport綆$悊鐩戝惉鍣?br />
鍙互閫氳繃java.bean鍖呬笅鐨凱ropertyChangeSupport綾繪潵綆$悊鐩戝惉鍣ㄣ傝浣跨敤榪欎釜綾伙紝bean蹇呴』鏈変竴涓綾葷殑鏁版嵁鍩熴俻rivate PropertyChangeSupport listeners = new PropertyChangeSupport(this);
榪欐牱鍙互灝嗘坊鍔犲拰縐婚櫎鐩戝惉鍣ㄧ殑浠誨姟浜ょ粰榪欎釜瀵硅薄銆俻ublic void addPropertyChangeListener(PropertyChangeListener listener) {
listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
listeners.removePropertyChangeListener(listener);
}
褰揵ean鐨勫睘鎬у彂鐢熷彉鍖栨椂錛屼嬌鐢≒ropertyChangeSupport瀵硅薄鐨刦irePropertyChange鏂規硶錛屼細灝嗕竴涓簨浠跺彂閫佺粰鎵鏈夊凡緇忔敞鍐岀殑鐩戝惉鍣ㄣ傝鏂規硶鏈変笁涓弬鏁幫細灞炴х殑鍚嶅瓧銆佹棫鐨勫間互鍙婃柊鐨勫箋傚睘鎬х殑鍊煎繀欏繪槸瀵硅薄錛屽鏋滄槸綆鍗曟暟鎹被鍨嬶紝鍒欏繀欏昏繘琛屽寘瑁呫俵isteners.firePropertyChange("ourString", oldString, newString);
鎵鏈夋敞鍐岀殑鐩戝惉鍣ㄥ疄鐜癙ropertyChangeListener鎺ュ彛錛岃鎺ュ彛涓彧鏈変竴涓柟娉曘俻ublic void propertyChange(PropertyChangeEvent e)
褰揵ean鐨勫睘鎬у煎彂鐢熷彉鍖栨椂錛岃鏂規硶涓殑浠g爜灝變細琚Е鍙戙傚彲浠ラ氳繃e.getOldValue();
e.getNewValue();
鏉ュ緱鍒癱hanges.firePropertyChange("ourString", oldString, newString);涓殑oldString鍜宯ewString銆?br />
3錛庝負浠涔堣浣跨敤PropertyChangeSupport
浣跨敤榪欎釜綾葷鐞嗙洃鍚櫒鐨勫ソ澶勬槸錛屽畠鏄嚎紼嬪畨鍏ㄧ殑銆傚鏋滀嬌鐢ㄤ竴涓驚鐜綋鏉et Bean鐨勫睘鎬э紝鍒欒繖涓被鍙互淇濊瘉鎵鏈夌洃鍚櫒鎵ц瑙﹀彂浜嬩歡鐨勬湁搴忋?br />
榪樻湁涓涓ソ澶勬槸錛岃繖涓被鏀寔fire甯︾儲寮曠殑灞炴ф敼鍙樹簨浠訛紙璇﹁java.bean.IndexedPropertyChangeEvent錛夈傛鏃跺悜娉ㄥ唽鐨勭洃鍚櫒鍙戦佷竴涓狿ropertyChangeEvent鐨勬柟娉曚負錛歷oid fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)
4錛庡疄渚嬩唬鐮?
public class SomeBean {
private String property;
private PropertyChangeSupport changeSupport;
public void setProperty(String newValue) {
String oldValue = property;
property = newValue;
changeSupport.firePropertyChange("property", oldValue, newValue);
}
public void addPropertyChangeListener(PropertyChangeListener l) {
changeSupport.add(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changeSupport.remove(l);
}
}
鏈榪戠湅浠g爜涓鐩寸鍒拌繖涓被錛屽厛鍋氫竴涓葷粨銆?br />
鍏堢湅PropertyChangeSupport綾葷殑瀹樻柟鏂囨。瑙i噴錛?br />
This is a utility class that can be used by beans that support bound properties. You can use an instance of this class as a member field of your bean and delegate various work to it.
1錛庡叧鑱斿睘鎬?br />
鍦↗avaBean鐨勮璁′腑錛屾寜鐓у睘鎬х殑涓嶅悓浣滅敤鍙堢粏鍒嗕負鍥涚被錛氬崟鍊煎睘鎬с佺儲寮曞睘鎬с佸叧鑱斿睘鎬с侀檺鍒跺睘鎬с傚叧鑱斿睘鎬э紝涔熺О涔嬩負緇戝畾灞炴с傜粦瀹氬睘鎬т細鍦ㄥ睘鎬у煎彂鐢熷彉鍖栨椂錛岄氱煡鎵鏈夌浉鍏崇殑鐩戝惉鍣ㄣ備負浜嗗疄鐜頒竴涓粦瀹氬睘鎬э紝蹇呴』瀹炵幇涓や釜鏈哄埗銆?br />
1錛? 鏃犺浣曟椂錛屽彧瑕佸睘鎬х殑鍊煎彂鐢熷彉鍖栵紝璇ean蹇呴』鍙戦佷竴涓狿ropertyChange浜嬩歡緇欐墍鏈夊凡娉ㄥ唽鐨勭洃鍚櫒銆?br />
2錛? 涓轟簡浣跨洃鍚櫒鑳藉娉ㄥ唽錛宐ean蹇呴』瀹炵幇浠ヤ笅涓や釜鏂規硶錛歷oid addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangerListener(PropertyChangerListener listener);
2錛庝嬌鐢≒ropertyChangeSupport綆$悊鐩戝惉鍣?br />
鍙互閫氳繃java.bean鍖呬笅鐨凱ropertyChangeSupport綾繪潵綆$悊鐩戝惉鍣ㄣ傝浣跨敤榪欎釜綾伙紝bean蹇呴』鏈変竴涓綾葷殑鏁版嵁鍩熴俻rivate PropertyChangeSupport listeners = new PropertyChangeSupport(this);
榪欐牱鍙互灝嗘坊鍔犲拰縐婚櫎鐩戝惉鍣ㄧ殑浠誨姟浜ょ粰榪欎釜瀵硅薄銆俻ublic void addPropertyChangeListener(PropertyChangeListener listener) {
listeners.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
listeners.removePropertyChangeListener(listener);
}
褰揵ean鐨勫睘鎬у彂鐢熷彉鍖栨椂錛屼嬌鐢≒ropertyChangeSupport瀵硅薄鐨刦irePropertyChange鏂規硶錛屼細灝嗕竴涓簨浠跺彂閫佺粰鎵鏈夊凡緇忔敞鍐岀殑鐩戝惉鍣ㄣ傝鏂規硶鏈変笁涓弬鏁幫細灞炴х殑鍚嶅瓧銆佹棫鐨勫間互鍙婃柊鐨勫箋傚睘鎬х殑鍊煎繀欏繪槸瀵硅薄錛屽鏋滄槸綆鍗曟暟鎹被鍨嬶紝鍒欏繀欏昏繘琛屽寘瑁呫俵isteners.firePropertyChange("ourString", oldString, newString);
鎵鏈夋敞鍐岀殑鐩戝惉鍣ㄥ疄鐜癙ropertyChangeListener鎺ュ彛錛岃鎺ュ彛涓彧鏈変竴涓柟娉曘俻ublic void propertyChange(PropertyChangeEvent e)
褰揵ean鐨勫睘鎬у煎彂鐢熷彉鍖栨椂錛岃鏂規硶涓殑浠g爜灝變細琚Е鍙戙傚彲浠ラ氳繃e.getOldValue();
e.getNewValue();
鏉ュ緱鍒癱hanges.firePropertyChange("ourString", oldString, newString);涓殑oldString鍜宯ewString銆?br />
3錛庝負浠涔堣浣跨敤PropertyChangeSupport
浣跨敤榪欎釜綾葷鐞嗙洃鍚櫒鐨勫ソ澶勬槸錛屽畠鏄嚎紼嬪畨鍏ㄧ殑銆傚鏋滀嬌鐢ㄤ竴涓驚鐜綋鏉et Bean鐨勫睘鎬э紝鍒欒繖涓被鍙互淇濊瘉鎵鏈夌洃鍚櫒鎵ц瑙﹀彂浜嬩歡鐨勬湁搴忋?br />
榪樻湁涓涓ソ澶勬槸錛岃繖涓被鏀寔fire甯︾儲寮曠殑灞炴ф敼鍙樹簨浠訛紙璇﹁java.bean.IndexedPropertyChangeEvent錛夈傛鏃跺悜娉ㄥ唽鐨勭洃鍚櫒鍙戦佷竴涓狿ropertyChangeEvent鐨勬柟娉曚負錛歷oid fireIndexedPropertyChange(String PropertyName,int index,Object oldValue,Object newValue)
4錛庡疄渚嬩唬鐮?
public class SomeBean {
private String property;
private PropertyChangeSupport changeSupport;
public void setProperty(String newValue) {
String oldValue = property;
property = newValue;
changeSupport.firePropertyChange("property", oldValue, newValue);
}
public void addPropertyChangeListener(PropertyChangeListener l) {
changeSupport.add(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changeSupport.remove(l);
}
}