锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Java鍔ㄦ佺▼搴忚璁★細鍙嶅皠浠嬬粛
muzi_li 緲昏瘧 鐗堟湰錛?.0
Java鍔ㄦ佺▼搴忚璁★細鍙嶅皠浠嬬粛
浣跨敤榪愯鐨勭被鐨勪俊鎭嬌浣犵殑紼嬪簭璁捐鏇村姞鐏墊椿
鍙嶅皠鎺堜簣浜嗕綘鐨勪唬鐮佽闂杞借繘JVM鍐呯殑Java綾葷殑鍐呴儴淇℃伅鐨勬潈闄愶紝騫朵笖鍏佽浣犵紪鍐欏湪紼嬪簭鎵ц鏈熼棿涓庢墍閫夋嫨鐨勭被鐨勪竴鍚屽伐浣滅殑浠g爜錛岃屼笉鏄湪婧愪唬鐮佷腑銆傝繖縐嶆満鍒朵嬌寰楀弽灝勬垚涓哄垱寤虹伒媧葷殑搴旂敤紼嬪簭鐨勫己澶у伐鍏鳳紝浣嗘槸瑕佸皬蹇冪殑鏄紝濡傛灉浣跨敤涓嶆伆褰擄紝鍙嶅皠浼氬甫鏉ュ緢澶х殑鍓綔鐢ㄣ傚湪榪欑瘒鏂囩珷涓紝杞歡鍜ㄨ欏鵑棶Dennis Sosnoski 浠嬬粛浜嗗弽灝勭殑浣跨敤錛屽悓鏃惰繕浠嬬粛浜嗕竴浜涗嬌鐢ㄥ弽灝勬墍瑕佷粯鍑虹殑浠d環(huán)銆傚湪榪欓噷錛屼綘鍙互鎵懼埌Java鍙嶅皠API鏄浣曞湪榪愯鏃惰浣犻挬鍏ュ璞$殑銆?BR>
鍦ㄧ涓閮ㄥ垎錛屾垜鍚戜綘浠嬬粛浜咼ava紼嬪簭璁捐鐨勭被浠ュ強綾葷殑瑁呰澆銆傞偅綃囨枃绔犱腑鎻忚堪浜嗗緢澶氬嚭鐜板湪Java浜岃繘鍒剁被鏍煎紡涓殑淇℃伅錛岀幇鍦ㄦ垜鏉ヤ粙緇嶅湪榪愯鏃朵嬌鐢ㄥ弽灝凙PI璁塊棶鍜屼嬌鐢ㄨ繖浜涗俊鎭殑鍩虹銆備負浜嗕嬌閭d簺宸茬粡浜嗚В鍙嶅皠鍩虹鐨勫紑鍙戜漢鍛樺榪欎簺浜嬫儏鎰熷叴瓚o紝鎴戣繕浼氫粙緇嶄竴浜涘弽灝勪笌鐩存帴璁塊棶鐨勫湪鎬ц兘鏂歸潰鐨勬瘮杈冦?BR>
浣跨敤鍙嶅皠涓庡拰metadata(鎻忚堪鍏跺畠鏁版嵁鐨勬暟鎹?涓浜涘伐浣滅殑Java紼嬪簭璁捐鏄笉鍚岀殑銆傞氳繃Java璇█鍙嶅皠鏉ヨ闂殑鍏冩暟鎹殑鐗規(guī)畩綾誨瀷鏄湪JVM鍐呴儴鐨勭被鍜屽璞$殑鎻忚堪銆傚弽灝勪嬌浣犲彲浠ュ湪榪愯鏃惰闂悇縐嶇被淇℃伅錛屽畠鐢氳嚦鍙互浣犺鍦ㄨ繍琛屾椂璇誨啓灞炴у瓧孌點佽皟鐢ㄦ墍閫夋嫨鐨勭被鐨勬柟娉曘?BR>
鍙嶅皠鏄竴涓己澶х殑宸ュ叿錛屽畠璁╀綘寤虹珛鐏墊椿鑳藉鍦ㄨ繍琛屾椂緇勮鐨勪唬鐮侊紝鑰屼笉闇瑕佽繛鎺ョ粍浠墮棿鐨勬簮浠g爜銆傚弽灝勭殑涓浜涚壒寰佷篃甯︽潵涓浜涢棶棰樸傚湪榪欑珷涓紝鎴戝皢浼氭帰絀跺湪搴旂敤紼嬪簭涓笉鎵撶畻浣跨敤鍙嶅皠鐨勫師鍥狅紝浠ヤ負浠涔堜嬌鐢ㄥ畠鐨勫師鍥犮傚湪浣犱簡瑙e埌榪欎簺鍒╁紛涔嬪悗錛屼綘灝變細鍦ㄥソ澶勫ぇ浜庣己鐐圭殑鏃跺欏仛鍑哄喅瀹氥?BR>
鍒濊瘑class
浣跨敤鍙嶅皠鐨勮搗鐐規(guī)繪椂涓涓猨ava.lang.Class綾葷殑瀹炰緥銆傚鏋滀綘涓庝竴涓鍏堢‘瀹氱殑綾諱竴鍚屽伐浣滐紝Java璇█涓虹洿鎺ヨ幏寰桟lass綾葷殑瀹炰緥鎻愪緵浜嗕竴涓畝鍗曠殑蹇嵎鏂瑰紡銆備緥濡傦細
Class clas = MyClass.class;
褰撲綘浣跨敤榪欓」鎶鏈殑鏃跺欙紝鎵鏈変笌瑁呰澆綾繪湁鍏崇殑宸ヤ綔閮藉彂鐢熷湪騫曞悗銆傚鏋滀綘闇瑕佸湪榪愯鏃朵粠澶栭儴鐨勮祫婧愪腑璇誨彇綾誨悕錛屼嬌鐢ㄤ笂闈㈣繖縐嶆柟娉曟槸涓嶄細杈懼埌鐩殑鐨勶紝鐩稿弽浣犻渶瑕佷嬌鐢ㄧ被瑁呰澆鍣ㄦ潵鏌ユ壘綾葷殑淇℃伅錛屾柟娉曞涓嬫墍紺猴細
// "name" is the class name to load
Class clas = null;
try {
clas = Class.forName(name);
} catch (ClassNotFoundException ex) {
// handle exception case
}
// use the loaded class
濡傛灉綾誨凡緇忚杞斤紝浣犲皢浼氭壘鍒板綋鍓嶅湪鍦ㄧ殑綾葷殑淇℃伅銆傚鏋滅被榪樻病鏈夎瑁呰澆錛岄偅涔堢被瑁呰澆鍣ㄥ皢浼氳杞藉畠錛屽茍涓旇繑鍥炴渶榪戝垱寤虹殑綾葷殑瀹炰緥銆?BR>
鍏充簬綾葷殑鍙嶅皠
Class瀵硅薄緇欎簣浣犱簡鎵鏈夌殑鐢ㄤ簬鍙嶅皠璁塊棶綾葷殑鍏冩暟鎹殑鍩烘湰閽╁瓙銆傝繖浜涘厓鏁版嵁鍖呮嫭鏈夊叧綾葷殑鑷韓淇℃伅錛屼緥濡傝薄綾葷殑鍖呭拰瀛愮被錛岃繕鏈夎繖涓被鎵瀹炵幇鐨勬帴鍙o紝榪樺寘鎷繖涓被鎵瀹氫箟鐨勬瀯閫犲櫒銆佸睘鎬у瓧孌典互鍙婃柟娉曠殑璇︾粏淇℃伅銆傚悗闈㈢殑榪欎簺欏規(guī)槸鎴戜滑鍦ㄧ▼搴忚璁¤繃縐嶇粡甯鎬嬌鐢ㄧ殑錛屽洜姝ゅ湪榪欎竴鑺傜殑鍚庨潰鎴戜細緇欏嚭涓浜涚敤榪欎簺淇℃伅鏉ュ伐浣滅殑渚嬪瓙銆?BR>
瀵逛簬綾葷殑鏋勯犱腑鐨勬瘡涓縐嶇被鍨嬶紙鏋勯犲櫒銆佸睘鎬у瓧孌點佹柟娉曪級錛宩ava.lang.Class鎻愪緵浜嗗洓縐嶇嫭绔嬬殑鍙嶅皠璋冪敤浠ヤ笉鐨勬柟寮忔潵璁塊棶綾葷殑淇℃伅銆備笅闈㈠垪鍑轟簡榪欏洓縐嶈皟鐢ㄧ殑鏍囧噯褰㈠紡錛屽畠鏄竴緇勭敤浜庢煡鎵炬瀯閫犲櫒鐨勮皟鐢ㄣ?BR>
Constructor getConstructor(Class[] params) 浣跨敤鎸囧畾鐨勫弬鏁扮被鍨嬫潵鑾峰緱鍏叡鐨勬瀯閫犲櫒錛?BR>Constructor[] getConstructors() 鑾峰緱榪欎釜綾葷殑鎵鏈夋瀯閫犲櫒錛?BR>Constructor getDeclaredConstructor(Class[] params) 浣跨敤鎸囧畾鐨勫弬鏁扮被鍨嬫潵鑾峰緱鏋勯犲櫒錛堝拷鐣ヨ闂殑綰у埆錛?BR>Constructor[] getDeclaredConstructors() 鑾峰緱榪欎釜綾葷殑鎵鏈夌殑鏋勯犲櫒錛堝拷鐣ヨ闂殑綰у埆錛?BR>
涓婅堪鐨勬瘡涓縐嶆柟娉曢兘榪斿洖涓鎴栧涓猨ava.lang.reflect.Constructor鐨勫疄渚嬨侰onstructor綾誨畾涔変簡涓涓渶瑕佷竴涓璞℃暟鎹仛涓哄敮涓鍙傛暟鐨刵ewInstance鏂規(guī)硶錛岀劧鍚庤繑鍥炰竴涓渶榪戝垱寤虹殑鍘熷綾葷殑瀹炰緥銆傚璞℃暟緇勬槸鍦ㄦ瀯閫犲櫒璋冪敤鏃舵墍浣跨敤鐨勫弬鏁板箋備緥濡傦紝鍋囪浣犳湁涓涓甫鏈変竴瀵筍tring 綾誨瀷鍋氫負鍙傛暟鐨勬瀯閫犲櫒鐨凾woString綾伙紝浠g爜濡備笅鎵紺猴細
public class TwoString {
private String m_s1, m_s2;
public TwoString(String s1, String s2) {
m_s1 = s1;
m_s2 = s2;
}
}
涓嬮潰鐨勪唬鐮佹樉紺哄浣曡幏寰桾woString綾葷殑鏋勯犲櫒錛屽茍浣跨敤瀛楃涓測渁鈥濆拰鈥渂鈥濇潵鍒涘緩涓涓疄渚嬶細
Class[] types = new Class[] { String.class, String.class };
Constructor cons = TwoString.class.getConstructor(types);
Object[] args = new Object[] { "a", "b" };
TwoString ts = cons.newInstance(args);
涓婇潰鐨勪唬鐮佸拷鐣ヤ簡鍑犵鍙兘鐨勮涓嶅悓鐨勫弽灝勬柟娉曟姏鍑虹殑寮傚父媯鏌ョ殑綾誨瀷銆傝繖浜涘紓甯稿湪Javadoc銆API涓湁璇︾粏鐨勬弿榪幫紝鍥犳涓虹畝渚胯搗瑙侊紝鎴戜細鍦ㄦ墍鏈夌殑浠g爜涓拷鐣ュ畠浠?BR>
鍦ㄦ垜娑夊強鍒版瀯閫犲櫒榪欎釜涓婚鏃訛紝Java璇█涔熷畾涔変簡涓涓壒孌婄殑娌℃湁鍙傛暟鐨勶紙鎴栭粯璁わ級鏋勯犲櫒蹇嵎鏂規(guī)硶錛屼綘鑳戒嬌鐢ㄥ畠鏉ュ垱寤轟竴涓被鐨勫疄渚嬨傝繖涓揩鎹鋒柟娉曡薄涓嬮潰鐨勪唬鐮佽繖鏍瘋宓屽叆鍒扮被鐨勮嚜瀹氫箟涓細
Object newInstance() ?浣跨敤榛樿鐨勬瀯閫犲櫒鍒涘緩鏂扮殑瀹炰緥銆?BR>
灝界榪欑鏂規(guī)硶鍙浣犱嬌鐢ㄤ竴涓壒孌婄殑鏋勯犲櫒錛屼絾鏄鏋滀綘闇瑕佺殑璇濓紝瀹冩槸闈炲父渚垮埄鐨勫揩鎹鋒柟寮忋傝繖欏規(guī)妧鏈湪浣跨敤JavaBeans宸ヤ綔鐨勬椂鍊欏挨鍏舵湁鐢紝鍥犱負JavaBeans闇瑕佸畾涔変竴涓叕鍏辯殑銆佹病鏈夊弬鏁扮殑鏋勯犲櫒銆?BR>
閫氳繃鍙嶅皠鏉ユ煡鎵懼睘鎬у瓧孌?BR>
Class綾誨弽灝勮皟鐢ㄨ闂睘鎬у瓧孌典俊鎭笌閭d簺鐢ㄤ簬璁塊棶鏋勯犲櫒鐨勬柟娉曠被浼鹼紝鍦ㄦ湁鏁扮粍綾誨瀷鐨勫弬鏁扮殑浣跨敤灞炴у瓧孌靛悕鏉ユ浛浠o細浣跨敤鏂規(guī)硶濡備笅鎵紺猴細
Field getField(String name) --鑾峰緱鐢眓ame鎸囧畾鐨勫叿鏈塸ublic綰у埆鐨勫睘鎬у瓧孌?BR>Field getFields() ?鑾峰緱涓涓被鐨勬墍鏈夊叿鏈塸ublic綰у埆鐨勫睘鎬у瓧孌?BR>Field getDeclaredField(String name) ?鑾峰緱鐢眓ame鎸囧畾鐨勮綾誨0鏄庣殑灞炴у瓧孌?BR>Field getDeclaredFields() ?鑾峰緱鐢辯被瀹氫箟鐨勬墍鏈夌殑灞炴у瓧孌?BR>
灝界涓庢瀯閫犲櫒鐨勮皟鐢ㄥ緢鐩鎬技錛屼絾鏄湪鎻愬埌灞炴у瓧孌電殑鏃跺欙紝鏈変竴涓噸瑕佺殑宸埆錛氬墠涓や釜鏂規(guī)硶榪斿洖鑳借繃綾繪潵璁塊棶鐨勫叕鍏憋紙public錛夊睘鎬у瓧孌電殑淇℃伅錛堝寘鎷偅浜涙潵鑷簬瓚呯被鐨勫睘鎬у瓧孌碉級錛屽悗涓や釜鏂規(guī)硶榪斿洖鐢辯被鐩存帴澹版槑鐨勬墍鏈夌殑灞炴у瓧孌碉紙蹇界暐浜嗗睘鎬у瓧孌電殑璁塊棶綾誨瀷錛夈?BR>
Java.lang.reflect.Field鐨勫疄渚嬮氳繃璋冪敤瀹氫箟濂界殑getXXX鍜宻etXXX鏂規(guī)硶鏉ヨ繑鍥炴墍鏈夌殑鍘熷鐨勬暟鎹被鍨嬶紝灝卞儚鏅氱殑涓庡璞″紩鐢ㄤ竴璧峰伐浣滅殑get鍜宻et鏂規(guī)硶涓鏍楓傚敖綆etXXX鏂規(guī)硶浼氳嚜鍔ㄥ湴澶勭悊鏁版嵁綾誨瀷杞崲錛堜緥濡備嬌鐢╣etInt鏂規(guī)硶鏉ヨ幏鍙栦竴涓猙yte綾誨瀷鐨勫鹼級錛屼絾浣跨敤涓涓傚綋鍩轟簬瀹為檯鐨勫睘鎬у瓧孌電被鍨嬬殑鏂規(guī)硶鏄簲璇ヤ紭鍏堣冭檻鐨勩?BR>
涓嬮潰鐨勪唬鐮佹樉紺轟簡濡備綍浣跨敤灞炴у瓧孌電殑鍙嶅皠鏂規(guī)硶錛岄氳繃鎸囧畾灞炴у瓧孌靛悕錛屾壘鍒頒竴涓璞$殑int綾誨瀷鐨勫睘鎬у瓧孌碉紝騫剁粰榪欎釜灞炴у瓧孌靛煎姞1銆?BR>public int incrementField(String name, Object obj) throws... {
Field field = obj.getClass().getDeclaredField(name);
int value = field.getInt(obj) + 1;
field.setInt(obj, value);
return value;
}
榪欎釜鏂規(guī)硶寮濮嬪睍鐜頒竴浜涗嬌鐢ㄥ弽灝勬墍鍙兘甯︽潵鐨勭伒媧繪э紝瀹冧紭浜庝笌涓涓壒瀹氱殑綾諱竴鍚屽伐浣滐紝incrementField鏂規(guī)硶鎶婅鏌ユ壘鐨勭被淇℃伅鐨勫璞′紶閫掔粰getClass鏂規(guī)硶錛岀劧鍚庣洿鎺ュ湪閭d釜綾諱腑鏌ユ壘鍛藉悕鐨勫睘鎬у瓧孌點?BR>
閫氳繃鍙嶅皠鏉ユ煡鎵炬柟娉?BR>Class鍙嶅皠璋冪敤璁塊棶鏂規(guī)硶鐨勪俊鎭笌璁塊棶鏋勯犲櫒鍜屽瓧孌靛睘鎬х殑鏂規(guī)硶闈炲父鐩鎬技錛?BR> Method getMethod(String name,Class[] params) --浣跨敤鎸囧畾鐨勫弬鏁扮被鍨嬭幏寰楃敱name鍙傛暟鎸囧畾鐨刾ublic綾誨瀷鐨勬柟娉曘?BR>Mehtod[] getMethods()?鑾峰緱涓涓被鐨勬墍鏈夌殑public綾誨瀷鐨勬柟娉?BR>Mehtod getDeclaredMethod(String name, Class[] params)?浣跨敤鎸囧畾鐨勫弬鏁扮被鍨嬭幏寰楃敱name鍙傛暟鎵鎸囧畾鐨勭敱榪欎釜綾誨0鏄庣殑鏂規(guī)硶銆?BR>Method[] getDeclaredMethods() ?鑾峰緱榪欎釜綾繪墍澹版槑鐨勬墍鏈夌殑鏂規(guī)硶
涓庡睘鎬у瓧孌電殑璋冪敤涓鏍鳳紝鍓嶄袱涓柟娉曡繑鍥為氳繃榪欎釜綾葷殑瀹炰緥鍙互璁塊棶鐨刾ublic綾誨瀷鐨勬柟娉?鍖呮嫭閭d簺緇ф壙浜庤秴綾葷殑鏂規(guī)硶銆傚悗涓や釜鏂規(guī)硶榪斿洖鐢辮繖涓被鐩存帴澹版槑鐨勬柟娉曠殑淇℃伅錛岃屼笉綆℃柟娉曠殑璁塊棶綾誨瀷銆?BR>
閫氳繃璋冪敤榪斿洖鐨凧ava.lang.reflect.Mehtod瀹炰緥瀹氫箟浜嗕竴涓猧nvoke鏂規(guī)硶錛屼綘鍙互浣跨敤瀹冩潵璋冪敤瀹氫箟綾葷殑鏈夊叧瀹炰緥銆傝繖涓猧nvoke鏂規(guī)硶闇瑕佷袱涓弬鏁幫紝涓涓槸鎻愪緵榪欎釜鏂規(guī)硶鐨勭被鐨勫疄渚嬶紝涓涓槸璋冪敤榪欎釜鏂規(guī)硶鎵闇瑕佺殑鍙傛暟鍊肩殑鏁扮粍銆?BR>
涓嬮潰緇欏嚭浜嗘瘮灞炴у瓧孌電殑渚嬪瓙鏇村姞娣卞叆鐨勪緥瀛愶紝瀹冩樉紺轟簡涓涓殑鏂規(guī)硶鍙嶅皠鐨勪緥瀛愶紝榪欎釜鏂規(guī)硶浣跨敤get鍜宻et鏂規(guī)硶鏉ョ粰JavaBean瀹氫箟鐨刬nt綾誨瀷鐨勫睘鎬у仛澧為噺鎿嶄綔銆備緥濡傦紝濡傛灉瀵硅薄涓轟竴涓暣鏁扮被鍨媍ount灞炴у畾涔変簡getCount鍜宻etCount鏂規(guī)硶錛岄偅涔堜負浜嗙粰榪欎釜灞炴у仛澧為噺榪愮畻錛屼綘灝卞彲浠ユ妸鈥渃ount鈥濆仛涓哄弬鏁板悕浼犻掔粰璋冪敤鐨勮繖涓柟娉曚腑銆傜ず渚嬩唬鐮佸涓嬶細
public int incrementProperty(String name, Object obj) {
String prop = Character.toUpperCase(name.charAt(0)) +
name.substring(1);
String mname = "get" + prop;
Class[] types = new Class[] {};
Method method = obj.getClass().getMethod(mname, types);
Object result = method.invoke(obj, new Object[0]);
int value = ((Integer)result).intValue() + 1;
mname = "set" + prop;
types = new Class[] { int.class };
method = obj.getClass().getMethod(mname, types);
method.invoke(obj, new Object[] { new Integer(value) });
return value;
}
鏍規(guī)嵁JavaBeans鐨勮鑼冿紝鎴戞妸灞炴у悕鐨勭涓涓瓧姣嶈漿鎹負澶у啓錛岀劧鍚庡湪鍓嶉潰鍔犱笂鈥済et鈥濇潵寤虹珛璇誨彇灞炴у肩殑鏂規(guī)硶鍚嶏紝鍦ㄥ睘鎬у悕鍓嶅姞涓娾渟et鈥濇潵寤虹珛璁劇疆灞炴у肩殑鏂規(guī)硶鍚嶃侸avaBeans鐨勮鏂規(guī)硶鍙繑鍥炲睘鎬у鹼紝鍐欐柟娉曞彧闇瑕佽鍐欏叆鐨勫煎仛涓哄弬鏁幫紝鍥犳鎴戞寚瀹氫簡涓庤繖涓柟娉曠浉鍖歸厤鐨勫弬鏁扮被鍨嬨傛渶鍚庤鑼冭瀹氳繖涓や釜鏂規(guī)硶搴旇鏄痯ublic綾誨瀷鐨勶紝鍥犳鎴戜嬌鐢ㄤ簡鏌ユ壘鐩稿叧綾葷殑public綾誨瀷鏂規(guī)硶鐨勮皟鐢ㄥ艦寮忋?BR>
榪欎釜渚嬪瓙鎴戦鍏堜嬌鐢ㄥ弽灝勪紶閫掍竴涓師濮嬬被鍨嬬殑鍊鹼紝鍥犳璁╂垜浠潵鐪嬩竴涓嬪畠鏄庢牱宸ヤ綔鐨勩傚熀鏈殑鍘熺悊鏄畝鍗曠殑錛氭棤璁轟粈涔堟椂鍊欙紝浣犻渶瑕佷紶閫掍竴涓師濮嬬被鍨嬬殑鍊鹼紝浣犲彧瑕佹浛鎹㈢浉搴旂殑灝佽鍘熷綾誨瀷鐨勶紙鍦╦ava.lang 鍖呬腑瀹氫箟鐨勶級鐨勭被鐨勫疄渚嬪氨鍙互浜嗐傝繖縐嶆柟娉曞彲搴旂敤浜庤皟鐢ㄥ拰榪斿洖銆傚洜姝ゅ湪鎴戠殑渚嬪瓙涓皟鐢╣et鏂規(guī)硶鏃訛紝鎴戦鏈熺殑緇撴灉鏄竴涓敱java.lang.Integer綾繪墍灝佽鐨勫疄闄呯殑int綾誨瀷鐨勫睘鎬у箋?BR>
鍙嶅皠鏁扮粍
鍦↗ava璇█涓暟緇勬槸瀵硅薄錛岃薄鍏跺畠鎵鏈夌殑瀵硅薄涓鏍鳳紝瀹冩湁涓浜涚被銆傚鏋滀綘鏈変竴涓暟緇勶紝浣犲彲浠ュ拰鍏跺畠浠諱綍瀵硅薄涓鏍蜂嬌鐢ㄦ爣鍑嗙殑getClass鏂規(guī)硶鏉ヨ幏寰楄繖涓暟緇勭殑綾伙紝浣嗘槸浣犺幏寰楃殑榪欎釜綾諱笌鍏跺畠鐨勫璞$被鍨嬬浉姣旓紝涓嶅悓涔嬪鍦ㄥ畠娌℃湁涓涓幇瀛樼殑宸ヤ綔瀹炰緥銆傚嵆浣夸綘鏈変簡涓涓暟緇勭被涔嬪悗錛屼綘涔熶笉鑳藉鐩存帴鐢ㄥ畠鏉ュ仛浠諱綍浜嬫儏錛屽洜涓洪氳繃鍙嶅皠涓烘櫘閫氱殑綾繪墍鎻愪緵鐨勬瀯閫犲櫒璁塊棶涓嶈兘涓烘暟緇勫伐浣滐紝騫朵笖鏁扮粍娌℃湁浠諱綍鍙闂殑灞炴у瓧孌碉紝鍙湁鍩烘湰鐨勪負鏁扮粍瀵硅薄瀹氫箟鐨刯ava.lang.Object綾誨瀷鐨勬柟娉曘?BR>
鏁扮粍鐗規(guī)畩澶勭悊瑕佷嬌鐢╦ava.lang.reflect.Array綾繪彁渚涚殑涓涓潤鎬佹柟娉曠殑闆嗗悎錛岃繖涓被涓殑鏂規(guī)硶鍙互璁╀綘鍒涘緩鏂扮殑鏁扮粍錛岃幏寰椾竴涓暟緇勫璞$殑闀垮害錛屼互鍙婅鍐欎竴涓暟緇勫璞$殑绱㈠紩鍊箋?BR>
涓嬮潰鐨勪唬鐮佹樉紺轟簡鏈夋晥璋冩暣涓涓幇瀛樻暟緇勭殑灝哄鐨勬柟娉曘傚畠浣跨敤鍙嶅皠鏉ュ垱寤轟竴涓浉鍚岀被鍨嬬殑鏂版暟緇勶紝鐒跺悗鍦ㄨ繑鍥炶繖涓柊鏁扮粍涔嬪墠鎶婂師鏁扮粍涓殑鎵鏈夌殑鏁版嵁澶嶅埗鍒版柊鐨勬暟緇勪腑銆?BR>public Object growArray(Object array, int size) {
Class type = array.getClass().getComponentType();
Object grown = Array.newInstance(type, size);
System.arraycopy(array, 0, grown, 0,
Math.min(Array.getLength(array), size));
return grown;
}
瀹夊叏涓庡弽灝?BR>
鍦ㄥ鐞嗗弽灝勭殑鏃跺欙紝瀹夊叏鏄竴涓鏉傜殑闂銆傚弽灝勬甯歌妗嗘灦綾誨瀷鐨勪唬鐮佷嬌鐢紝騫跺洜涓鴻繖鏍鳳紝浣犲彲鑳戒細緇忓父瑕佹眰妗嗘灦涓嶅叧蹇冩櫘閫氱殑璁塊棶闄愬埗鏉ュ畬鍏ㄨ闂綘鐨勪唬鐮併傜劧鑰岋紝鑷敱鐨勮闂彲鑳戒細鍦ㄥ叾瀹冪殑涓浜涘疄渚嬩腑浜х敓涓浜涢闄╋紝渚嬪鍦ㄤ唬鐮佸湪涓涓笉琚俊浠葷殑浠g爜鍏變韓鐜涓鎵ц鐨勬椂鍊欍?BR>
鍥犱負榪欎簺鍐茬獊鐨勯渶瑕侊紝Java璇█瀹氫箟浜嗕竴涓綰ф柟娉曟潵澶勭悊鍙嶅皠瀹夊叏銆傚熀鏈殑妯″紡鏄湪鍙嶅皠璇鋒眰婧愮爜璁塊棶鐨勬椂鍊欏己鍒朵嬌鐢ㄥ涓嬬浉鍚岀殑綰︽潫闄愬埗錛?BR>璁塊棶榪欎釜綾諱腑鏉ヨ嚜浠諱綍鍦版柟鐨刾ublic緇勪歡錛?BR>涓嶈闂繖涓被鏈韓澶栭儴鐨刾rivate緇勪歡錛?BR>闄愬埗璁塊棶protected鍜宲ackage(榛樿璁塊棶)緇勪歡銆?BR>
鍥寸粫榪欎簺闄愬埗鏈変竴涓畝鍗曠殑鏂規(guī)硶錛屾垜鍦ㄥ墠闈㈢殑渚嬪瓙涓墍浣跨敤鐨勬墍鏈夋瀯閫犲櫒銆佸睘鎬у瓧孌點佷互鍙婄被鐨勬柟娉曢兘鎵╁睍浜庝竴涓叡鍚岀殑鍩虹被???java.lang.reflect.AccessibleObject綾匯傝繖涓被瀹氫箟浜嗕竴涓猻etAccessible鏂規(guī)硶錛岃繖涓柟娉曞彲浠ヨ浣犳墦寮鎴栧叧闂繖浜涘綾葷殑瀹炰緥鐨勮闂鏌ャ傚鏋滃畨鍏ㄧ鐞嗗櫒琚緗負鍏抽棴璁塊棶媯鏌ワ紝閭d箞灝卞厑璁鎬綘璁塊棶錛屽惁鍒欎笉鍏佽錛屽畨鍏ㄧ鐞嗗櫒浼氭姏鍑轟竴涓紓甯搞?BR>
涓嬮潰鏄竴涓嬌鐢ㄥ弽鍚戞潵婕旂ず榪欑琛屼負鐨凾woString綾葷殑瀹炰緥銆?BR>public class ReflectSecurity {
public static void main(String[] args) {
try {
TwoString ts = new TwoString("a", "b");
Field field = clas.getDeclaredField("m_s1");
// field.setAccessible(true);
System.out.println("Retrieved value is " +
field.get(inst));
} catch (Exception ex) {
ex.printStackTrace(System.out);
}
}
}
濡傛灉浣犵紪璇戣繖孌典唬鐮佸茍涓旂洿鎺ヤ嬌鐢ㄤ笉甯︿換浣曞弬鏁扮殑鍛戒護琛屽懡浠ゆ潵榪愯榪欎釜紼嬪簭錛屽畠浼氭姏鍑轟竴涓叧浜巉ield.get(inst)璋冪敤鐨処llegalAccessException寮傚父錛屽鏋滀綘鍘繪帀涓婇潰浠g爜涓璮ield.setAccessible(true)琛岀殑娉ㄩ噴錛岀劧鍚庣紪璇戝茍閲嶆柊榪愯浠g爜錛屽畠?yōu)兗氭垚鍔熸墽琛屻傛渶鍚庯紝濡傛灉浣犲湪鍛戒護琛岀粰JVM娣誨姞涓涓狣java.security.manager鍙傛暟錛屼嬌寰楀畨鍏ㄧ鐞嗗櫒鍙敤錛岄偅涔堝畠鍙堜細澶辮觸錛岄櫎闈炰綘涓篟eflectSecurity綾誨畾涔夊畨鍏ㄨ鍙?BR>
鍙嶅皠鎬ц兘
鍙嶅皠鏄竴涓己澶х殑宸ュ叿錛屼絾鏄篃浼氬甫涓浜涚己鐐廣備富瑕佺己鐐逛箣涓灝辨槸瀵規(guī)ц兘鐨勫獎鍝嶃備嬌鐢ㄥ弽灝勬槸鍩烘湰鐨勮В閲婃ф搷浣滐紝浣犲憡璇塉VM浣犺鍋氫粈涔堬紝瀹冨氨浼氫負浣犲仛浠涔堛傝繖縐嶆搷浣滅被鍨嬫繪槸姣旂洿鎺ュ仛鍚屾牱鐨勬搷浣滆鎱€備負浜嗘紨紺轟嬌鐢ㄥ弽灝勬墍瑕佷粯鍑虹殑鎬ц兘浠d環(huán)錛屾垜涓鴻繖綃囨枃绔犲噯澶囦簡涓濂楀熀鍑嗙▼搴忥紙鍙互浠庤祫婧愪腑涓嬭澆錛夈?BR>
涓嬮潰鍒楀嚭涓孌墊潵鑷簬灞炴у瓧孌電殑璁塊棶鎬ц兘嫻嬭瘯鐨勬憳瑕侊紝瀹冨寘鎷熀鏈殑嫻嬭瘯鏂規(guī)硶銆傛瘡涓柟娉曟祴璇曚竴縐嶈闂睘鎬у瓧孌電殑褰㈠紡錛宎ccessSame鏂規(guī)硶鍜屾湰瀵硅薄鐨勬垚鍛樺瓧孌典竴璧峰伐浣滐紝accessReference鏂規(guī)硶鐩存帴浣跨敤鍙﹀鐨勫璞″睘鎬у瓧孌墊潵瀛樺彇錛宎ccessReflection閫氳繃鍙嶅皠浣跨敤鍙︿竴涓璞$殑灞炴у瓧孌墊潵瀛樺彇錛屾瘡涓柟娉曢兘浣跨敤鐩稿悓鐨勮綆???鍦ㄥ驚鐜腑綆鍗曠殑鍔?涔樿繍綆椼?BR>public int accessSame(int loops) {
m_value = 0;
for (int index = 0; index < loops; index++) {
m_value = (m_value + ADDITIVE_VALUE) *
MULTIPLIER_VALUE;
}
return m_value;
}
public int accessReference(int loops) {
TimingClass timing = new TimingClass();
for (int index = 0; index < loops; index++) {
timing.m_value = (timing.m_value + ADDITIVE_VALUE) *
MULTIPLIER_VALUE;
}
return timing.m_value;
}
public int accessReflection(int loops) throws Exception {
TimingClass timing = new TimingClass();
try {
Field field = TimingClass.class.
getDeclaredField("m_value");
for (int index = 0; index < loops; index++) {
int value = (field.getInt(timing) +
ADDITIVE_VALUE) * MULTIPLIER_VALUE;
field.setInt(timing, value);
}
return timing.m_value;
} catch (Exception ex) {
System.out.println("Error using reflection");
throw ex;
}
}
嫻嬭瘯紼嬪簭鍦ㄤ竴涓ぇ寰幆涓弽澶嶇殑璋冪敤姣忎釜鏂規(guī)硶錛屽湪璋冪敤緇撴潫鍚庤綆楀鉤鍧囨椂闂淬傛瘡涓柟娉曠殑絎竴嬈¤皟鐢ㄤ笉鍖呮嫭鍦ㄥ鉤鍧囧間腑錛屽洜浜涘垵濮嬪寲鏃墮棿涓嶆槸褰卞搷緇撴灉鐨勫洜绱犮備負榪欑瘒鏂囩珷鎵鍋氱殑嫻嬭瘯榪愯錛屾垜涓烘瘡涓皟鐢ㄤ嬌鐢ㄤ簡10000000鐨勫驚鐜鏁幫紝浠g爜榪愯鍦?GHz銆PIII緋葷粺涓娿傚茍涓斿垎鍒嬌鐢ㄤ簡涓変釜涓嶅悓鐨凩inux銆JVM錛屽浜庢瘡涓狫VM閮戒嬌鐢ㄤ簡榛樿璁劇疆錛屾祴璇曠粨鏋滃涓嬪浘鎵紺猴細
涓婇潰鐨勫浘琛ㄧ殑鍒誨害鍙互鏄劇ず鏁翠釜嫻嬭瘯鑼冨洿錛屼絾鏄偅鏍風(fēng)殑璇濆氨浼氬噺灝戝樊鍒殑鏄劇ず鏁堟灉銆傝繖涓浘琛ㄤ腑鐨勫墠涓や釜鏄敤SUN鐨凧VM鐨勮繘琛屾祴璇曠殑緇撴灉鍥撅紝浣跨敤鍙嶅皠鐨勬墽琛屾椂闂存瘮浣跨敤鐩存帴璁塊棶鐨勬椂闂磋瓚呰繃1000澶氬嶃傛渶鍚庝竴涓浘鏄敤IBM鐨凧VM鎵鍋氱殑嫻嬭瘯錛岄氳繃姣旇緝瑕丼UN鐨凧VM鎵ц鏁堢巼瑕侀珮涓浜涳紝浣嗘槸浣跨敤鍙嶅皠鐨勬柟娉曚緷鐒惰姣斿叾瀹冩柟娉曡秴鍑?00澶氬嶃傝櫧鐒禝BM鐨凧VM瑕佹瘮SUN鐨凧VM鍑犱箮瑕佸揩涓ゅ嶏紝浣嗘槸鍦ㄤ嬌鐢ㄥ弽灝勪箣澶栫殑涓ょ鏂規(guī)硶涔嬮棿錛屽浜庝換浣曠殑JVM鍦ㄦ墽琛屾晥鐜囦笂娌℃湁澶ぇ鐨勫樊鍒傛渶澶х殑鍙兘鏄紝榪欑宸埆鍙嶆槧浜嗛氳繃Sun Hot Spot JVMs鍦ㄧ畝鍖栧熀鍑嗘柟闈㈡墍鍋氱殑涓撻棬浼樺寲寰堝皯銆?BR>
闄や簡灞炴у瓧孌佃闂椂闂寸殑嫻嬭瘯浠ュ錛屾垜瀵規(guī)柟娉曞仛浜嗗悓鏍風(fēng)殑嫻嬭瘯銆傚浜庢柟娉曠殑璋冪敤錛屾垜鍋胯瘯浜嗕笌灞炴у瓧孌佃闂祴璇曚竴鏍風(fēng)殑涓夌鏂瑰紡錛岀敤棰濆浣跨敤浜嗘病鏈夊弬鏁扮殑鏂規(guī)硶鐨勫彉閲忎笌浼犻掑茍榪斿洖涓涓肩殑鏂規(guī)硶璋冪敤鐩稿姣斻備笅闈㈢殑浠g爜鏄劇ず浜嗕嬌鐢ㄤ紶閫掑茍榪斿洖鍊肩殑璋冪敤鏂瑰紡榪涜嫻嬭瘯鐨勪笁縐嶆柟娉曘?BR>public int callDirectArgs(int loops) {
int value = 0;
for (int index = 0; index < loops; index++) {
value = step(value);
}
return value;
}
public int callReferenceArgs(int loops) {
TimingClass timing = new TimingClass();
int value = 0;
for (int index = 0; index < loops; index++) {
value = timing.step(value);
}
return value;
}
public int callReflectArgs(int loops) throws Exception {
TimingClass timing = new TimingClass();
try {
Method method = TimingClass.class.getMethod
("step", new Class [] { int.class });
Object[] args = new Object[1];
Object value = new Integer(0);
for (int index = 0; index < loops; index++) {
args[0] = value;
value = method.invoke(timing, args);
}
return ((Integer)value).intValue();
} catch (Exception ex) {
System.out.println("Error using reflection");
throw ex;
}
}
涓嬪浘鏄劇ず鎴戜嬌鐢ㄨ繖浜涙柟娉曠殑嫻嬭瘯緇撴灉錛岃繖閲屽啀涓嬈℃樉紺轟簡鍙嶅皠瑕佹瘮鍏跺畠鐨勭洿鎺ヨ闂鎱㈠緢澶氥傝櫧鐒跺浜庢棤鍙傛暟鐨勬渚嬶紝鎵ц鏁堢巼浠嶴UN1.3.1JVM鐨勬參鍑犵櫨鍊嶅埌IBM鐨凧VM鎱笉鍒?0鍊嶏紝涓庡睘鎬у瓧孌佃闂渚嬬浉姣旓紝宸埆涓嶆槸寰堝ぇ錛岃繖縐嶆儏鍐電殑閮ㄥ垎鍘熷洜鏄洜涓簀ava.lang.Integer鐨勫寘瑁呭櫒闇瑕佷紶閫掑拰榪斿洖int綾誨瀷鐨勫箋傚洜涓篒ntergers鏄笉鍙樼殑錛屽洜姝ゅ氨闇瑕佷負姣忎釜鏂規(guī)硶鐨勮繑鍥炵敓鎴愪竴涓柊鍊鹼紝榪欏氨澧炲姞浜嗙浉褰撳ぇ鐨勭郴緇熷紑閿銆?BR>
鍙嶅皠鐨勬ц兘鏄疭UN鍦ㄥ紑鍙?.4JVM鏃墮噸鐐瑰叧娉ㄧ殑涓涓鍩燂紝浠庝笂鍥懼彲浠ョ湅鍒版敼鍠勭殑緇撴灉銆係un1.4.1JVM瀵逛簬榪欑綾誨瀷鐨勬搷浣滄瘮1.3.1鐗堟湁浜嗗緢澶х殑鎻愰珮錛岃鎴戠殑嫻嬭瘯涓蹇ぇ綰?鍊嶃侷BM鐨?.4.0JVM瀵逛簬榪欑嫻嬭瘯鎻愪緵浜嗘洿濂界殑鎬ц兘錛屽畠鐨勮繍琛屾晥鐜囪姣擲un1.4.1JVM蹇袱鍒頒笁鍊嶃?BR>
鎴戣繕涓轟嬌鐢ㄥ弽灝勫垱寤哄璞$紪鍐欎簡涓涓被浼肩殑鏁堢巼嫻嬭瘯紼嬪簭銆傝櫧鐒惰繖涓緥瀛愪笌灞炴у瓧孌靛拰鏂規(guī)硶璋冪敤鐩告瘮宸埆涓嶆槸寰堝ぇ錛屼絾鏄湪Sun1.3.1JVM涓婅皟鐢╪ewInstance錛堬級鏂規(guī)硶鍒涘緩涓涓畝鍗曠殑java.lang.Object澶х害姣旂洿鎺ヤ嬌鐢╪ew Object()鏂規(guī)硶闀?2鍊嶇殑鏃墮棿錛屽湪IBM1.4.0JVM涓婂ぇ綰﹁闀?鍊嶇殑鏃墮棿錛屽湪Sun1.4.1JVM涓婂ぇ綰﹁闀?鍊嶇殑鏃墮棿銆傚浜庝換浣曠敤浜庢祴璇曠殑JVM錛屼嬌鐢ˋrray.newInstance(Type,size)鏂規(guī)硶鍒涘緩涓涓暟緇勬墍闇瑕佺殑鏃墮棿姣斾嬌鐢╪ew tye[size]鎵鑺辮垂鐨勬椂闂村ぇ綰﹁闀夸袱鍊嶏紝闅忕潃鏁扮粍姘戝昂瀵哥殑澧為暱錛岃繖涓ょ鏂規(guī)硶鐨勫樊鍒殑灝嗛殢涔嬪噺灝戙?BR>
鍙嶅皠姒傝鎬葷粨
Java 璇█鐨勫弽灝勬満鍒舵彁渚涗簡涓縐嶉潪甯擱氱敤鐨勫姩鎬佽繛鎺ョ▼搴忕粍浠剁殑鏂規(guī)硶銆傚畠鍏佽浣犵殑紼嬪簭鍒涘緩鍜岀淮鎶や換浣曠被鐨勫璞★紙鏈嶄粠瀹夊叏闄愬埗錛夛紝鑰屼笉闇瑕佹彁鍓嶅鐩爣綾昏繘琛岀‖緙栫爜銆傝繖浜涚壒寰佷嬌寰楀弽灝勫湪鍒涘緩涓庡璞′竴鍚屽伐浣滅殑綾誨簱涓殑閫氱敤鏂規(guī)硶鏂歸潰闈炲父鏈夌敤銆備緥濡傦紝鍙嶅皠緇忓父琚敤浜庨偅浜涙暟鎹簱錛孹ML銆佹垨鑰呭叾瀹冪殑澶栭儴鐨勬寔涔呭寲瀵硅薄鐨勬鏋朵腑銆?BR>
鍙嶅皠榪樻湁涓や釜緙虹偣錛屼竴涓槸鎬ц兘闂銆傚湪浣跨敤灞炴у瓧孌靛拰鏂規(guī)硶璁塊棶鐨勬椂鍊欙紝鍙嶅皠瑕佹瘮鐩存帴鐨勪唬鐮佽闂鎱㈠緢澶氥傝嚦浜庡褰卞搷鐨勭▼搴︼紝渚濊禆浜庡湪紼嬪簭涓庢牱浣跨敤鍙嶅皠銆傚鏋滃畠琚敤浣滀竴涓浉鍏崇殑寰堝皯鍙戠敓鐨勭▼搴忔搷浣滀腑錛岄偅涔堝氨涓嶅繀鍏沖績闄嶄綆鐨勬ц兘錛屽嵆浣垮湪鎴戠殑嫻嬭瘯涓墍灞曠ず鐨勬渶鑰楁椂鐨勫弽灝勬搷浣滅殑鍥懼艦涓篃鍙槸鍑犲井縐掔殑鏃墮棿銆傚鏋滆鍦ㄦ墽琛屽簲鐢ㄧ▼搴忕殑鏍稿績閫昏緫涓嬌鐢ㄥ弽灝勶紝鎬ц兘闂鎵嶆垚涓轟竴涓涓ヨ們瀵硅薄鐨勯棶棰樸?BR>
瀵逛簬寰堝搴旂敤涓殑瀛樺湪鐨勭己鐐規(guī)槸浣跨敤鍙嶅皠鍙互浣夸綘鐨勫疄闄呯殑浠g爜鍐呴儴閫昏緫鍙樺緱妯$硦涓嶆竻銆傜▼搴忓憳閮藉笇鏈涘湪婧愪唬鐮佷腑鐪嬪埌涓涓▼搴忕殑閫昏緫浠ュ強璞$粫榪囨簮浠g爜鐨勫弽灝勬墍鍙兘浜х敓鐨勭淮鎶ら棶棰樿繖鏍風(fēng)殑涓浜涙妧鏈傚弽灝勪唬鐮佷篃姣旂浉搴旂殑鐩存帴浠g爜瑕佸鏉備竴浜涳紝灝卞儚鍦ㄦц兘姣旇緝鐨勪唬鐮佸疄渚嬬湅鍒伴偅鏍楓傚鐞嗚繖浜涢棶棰樼殑鏈濂芥柟娉曟槸灝藉彲鑳藉皯浣跨敤鍙嶅皠錛屽彧鏈夊湪涓浜涘鍔犵伒媧繪х殑鍦版柟鏉ヤ嬌鐢ㄥ畠銆?BR>
鍦ㄤ笅涓綃囨枃绔犱腑錛屾垜灝嗙粰鍑轟竴涓洿鍔犺緇嗙殑濡備綍浣跨敤鍙嶅皠鐨勪緥瀛愩傝繖涓緥瀛愭彁渚涗簡涓涓敤浜庡鐞嗕紶閫掔粰涓涓狫ava搴旂敤紼嬪簭鐨勫懡浠よ鍙傛暟鐨凙PI銆傚湪閬垮厤寮辯偣鐨勫悓鏃訛紝瀹冧篃鏄劇ず浜嗗弽灝勭殑寮哄ぇ鐨勫姛鑳斤紝鍙嶅皠鑳藉浣跨敤鐨勪綘鐨勫懡浠ゅ鐞嗗彉寰楃殑綆鍗曞悧錛熶綘鍙互鍦↗ava 鍔ㄦ佺▼搴忚璁$殑絎笁閮ㄥ垎涓壘鍒扮瓟妗堛?BR>
]]>
//program: 絎涘崱灝?dāng)鏁板鍏?BR>//files: Heart.java
import java.applet.*;
import java.awt.*;
public class Heart extends Applet
{
int AppletWidth,AppletHeight;
Image OffScreen;
Graphics drawOffScreen;
public void init()
{
setBackground(Color.black);
//鍙栧緱鏄劇ず鍖哄煙
AppletWidth = getSize().width;
AppletHeight = getSize().height;
//寤虹珛嬈$敾闈?BR> OffScreen = createImage(AppletWidth,AppletHeight);
drawOffScreen = OffScreen.getGraphics();
}
public void paint(Graphics g)
{
drawOffScreen.clearRect(0,0,AppletWidth,AppletHeight);
drawOffScreen.setColor(Color.white);
int i,j;
double x,y,r;
for(i = 0;i <= 90;i++)
for(j = 0;j <= 90;j++)
{
//杞崲涓虹洿瑙掑潗鏍?BR> r = Math.PI/45*i*(1-Math.sin(Math.PI/45*j))*18;
x = r*Math.cos(Math.PI/45*j)*Math.sin(Math.PI/45*i)+AppletWidth/2;
y = -r*Math.sin(Math.PI/45*j)+AppletHeight/4;
//鎶曞獎鍒皒z騫抽潰
drawOffScreen.fillOval((int)x,(int)y,2,2);
}
g.drawImage(OffScreen,0,0,this);
}
}