锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浣滆咃細qlampskyface
鍜屼綔鑰呰仈緋伙細djb_skyface@tom.com
--------------------------------------------------------------------------------
鎺ヨЕ澶氱嚎紼嬪凡緇忎笉灝戞椂闂翠簡,涔熷仛浜嗕笉灝戜簨鎯?浣嗘槸涓鐩磋寰楃敤璧鋒潵涓嶉偅涔堥『鎵?鍦╠ebug鐨勬椂鍊?寰寰浼氭瘮杈冩媴蹇冨湪鍚屾涓婂嚭浠涔堥棶棰?鎯寵搗"紼嬪簭鍛樻渶鎬曠殑鏄嚜宸卞啓鐨勪唬鐮?榪欏彞璇?瑙夊緱鐪熸槸涓嶅亣.
緇堜簬鏈変竴澶?鎴戣寰楁槸鏃跺欐妸榪欎釜闂寮勬竻妤氫簡,鎵浠?鎴戝氨鍦ㄧ綉涓婃壘鐩稿叧鐨勫唴瀹圭湅,緇撴灉绔熺劧鏄壘涓嶅埌鍦ㄦ垜榪欎釜闃舵搴旇鐪嬬殑,涓嶆槸澶畝鍗?灝辨槸涓絎斿甫榪?涓嶇煡鎵浜?
搴熶簡涔濈墰浜岃檸涔嬪姏,緇堜簬宸笉澶氬紕娓呮浜?鍏朵腑鏈変笉灝戣鍖?浠ュ墠璁や負鐨勫拰鐪熺悊鐩稿樊鐢氬ぇ.鎯寵搗鑷繁鑺辮垂鐨勬椂闂?鐪熸槸瑙夊緱鏈夌偣澶?鎵浠ユ妸瀹冨啓鍑烘潵,涓鏄槻姝㈣嚜宸變互鍚庡張浼氬繕鎺?浜屾槸緇欏儚鎴戜竴鏍風殑浼兼噦闈炴噦鑰呯暀涓嬩竴鐐瑰彲浠ュ弬鑰冪殑涓滀笢.
闂茶瘽灝戣,杞叆姝i!
--------------------------------------------------------------------------------
鍏堜粠綰跨▼鐨勫垱寤鴻璧?綰跨▼鐨勫垱寤轟竴鍏辨湁涓ょ褰㈠紡:
--------------------------------------------------------------------------------
涓縐嶆槸緇ф壙鑷猅hread綾?Thread 綾繪槸涓涓叿浣撶殑綾伙紝鍗充笉鏄娊璞$被錛岃綾誨皝瑁呬簡綰跨▼鐨勮涓恒傝鍒涘緩涓涓嚎紼嬶紝紼嬪簭鍛樺繀欏誨垱寤轟竴涓粠 Thread 綾誨鍑虹殑鏂扮被銆傜▼搴忓憳閫氳繃瑕嗙洊 Thread 鐨?run() 鍑芥暟鏉ュ畬鎴愭湁鐢ㄧ殑宸ヤ綔銆傜敤鎴峰茍涓嶇洿鎺ヨ皟鐢ㄦ鍑芥暟錛涜屾槸閫氳繃璋冪敤 Thread 鐨?start() 鍑芥暟錛岃鍑芥暟鍐嶈皟鐢?run()銆?br>
渚嬪:
public class Test extends Thread{
public Test(){
}
public static void main(String args[]){
Test t1 = new Test();
Test t2 = new Test();
t1.start();
t2.start();
}
public void run(){
//do thread's things
}
}
--------------------------------------------------------------------------------
鍙︿竴縐嶆槸瀹炵幇Runnable鎺ュ彛,姝ゆ帴鍙e彧鏈変竴涓嚱鏁幫紝run()錛屾鍑芥暟蹇呴』鐢卞疄鐜頒簡姝ゆ帴鍙g殑綾誨疄鐜般?br>
渚嬪:
public class Test implements Runnable{
Thread thread1;
Thread thread2;
public Test(){
thread1 = new Thread(this,"1");
thread2 = new Thread(this,"2");
}
public static void main(String args[]){
Test t = new Test();
t.startThreads();
}
public void run(){
//do thread's things
}
public void startThreads(){
thread1.start();
thread2.start();
}
}
涓ょ鍒涘緩鏂瑰紡鐪嬭搗鏉ュ樊鍒笉澶?浣嗘槸寮勪笉娓呮鐨勮瘽錛屼篃璁鎬細灝嗕綘鐨勭▼搴忓紕寰椾竴鍥㈢碂銆備袱鑰呭尯鍒湁浠ヤ笅鍑犵偣錛?/p>
1.褰撲綘鎯崇戶鎵挎煇涓鍏跺畠綾繪椂,浣犲彧鑳界敤鍚庝竴縐嶆柟寮?
2.絎竴縐嶅洜涓虹戶鎵胯嚜Thread,鍙垱寤轟簡鑷韓瀵硅薄,浣嗘槸鍦ㄦ暟閲忎笂錛岄渶瑕佸嚑涓嚎紼嬶紝灝卞緱鍒涘緩鍑犱釜鑷韓瀵硅薄錛涚浜岀鍙垱寤轟竴涓嚜韜璞★紝鍗村垱寤哄嚑涓猅hread瀵硅薄.鑰屼袱縐嶆柟娉曢噸澶х殑鍖哄埆灝卞湪浜庢錛岃浣犺冭檻錛氬鏋滀綘鍦ㄧ涓縐嶉噷鍒涘緩鏁頒釜鑷韓瀵硅薄騫朵笖start()鍚庯紝浣犱細鍙戠幇濂藉儚synchronized涓嶈搗浣滅敤浜嗭紝宸茬粡鍔犻攣鐨勪唬鐮佸潡鎴栬呮柟娉曞眳鐒跺悓鏃跺彲浠ユ湁鍑犱釜綰跨▼榪涘幓錛岃屼笖鍚屾牱涓涓彉閲忥紝灞呯劧鍙互鏈夊ソ鍑犱釜綰跨▼鍚屾椂鍙互鍘繪洿鏀瑰畠銆傦紙渚嬪涓嬮潰鐨勪唬鐮侊級榪欐槸鍥犱負錛屽湪榪欎釜紼嬪簭涓紝铏界劧浣犺搗浜嗘暟涓嚎紼嬶紝鍙槸浣犱篃鍒涘緩浜嗘暟涓璞★紝鑰屼笖錛屾瘡涓嚎紼嬪搴斾簡姣忎釜瀵硅薄涔熷氨鏄錛屾瘡涓嚎紼嬫洿鏀瑰拰鍗犳湁鐨勫璞¢兘涓嶄竴鏍鳳紝鎵浠ュ氨鍑虹幇浜嗗悓鏃舵湁鍑犱釜綰跨▼榪涘叆涓涓柟娉曠殑鐜拌薄錛屽叾瀹烇紝閭d篃涓嶆槸涓涓柟娉曪紝鑰屾槸涓嶅悓瀵硅薄鐨勭浉鍚岀殑鏂規硶銆傛墍浠ワ紝榪欐椂鍊欎綘瑕佸姞閿佺殑璇濓紝鍙兘灝嗘柟娉曟垨鑰呭彉閲忓0鏄庝負闈欐侊紝灝唖tatic鍔犱笂鍚庯紝浣犲氨浼氬彂鐜幫紝綰跨▼鍙堣兘綆′綇鏂規硶浜嗭紝鍚屾椂涓嶅彲鑳芥湁涓や釜綰跨▼榪涘叆鍚屾牱涓涓柟娉曪紝閭f槸鍥犱負錛岀幇鍦ㄤ笉鏄瘡涓璞¢兘鎷ユ湁涓涓柟娉曚簡錛岃屾槸鎵鏈夌殑瀵硅薄鍏卞悓鎷ユ湁涓涓柟娉曪紝榪欎釜鏂規硶灝辨槸闈欐佹柟娉曘?/p>
鑰屼綘濡傛灉鐢ㄧ浜岀鏂規硶浣跨敤綰跨▼鐨勮瘽錛屽氨涓嶄細鏈変笂榪扮殑鎯呭喌錛屽洜涓烘鏃訛紝浣犲彧鍒涘緩浜嗕竴涓嚜韜璞★紝鎵浠ワ紝鑷韓瀵硅薄鐨勫睘鎬у拰鏂規硶瀵逛簬綰跨▼鏉ヨ鏄叡鏈夌殑銆?/p>
鍥犳錛屾垜寤鴻錛屾渶濂界敤鍚庝竴縐嶆柟娉曟潵浣跨敤綰跨▼銆?/p>
public class mainThread extends Thread{
int i=0;
public static void main(String args[]){
mainThread m1 = new mainThread();
mainThread m2 = new mainThread();
mainThread m3 = new mainThread();
mainThread m4 = new mainThread();
mainThread m5 = new mainThread();
mainThread m6 = new mainThread();
m1.start();
m2.start();
m3.start();
m4.start();
m5.start();
m6.start();
}
public synchronized void t1(){
i=++i;
try{
Thread.sleep(500);
}
catch(Exception e){}
//姣忎釜綰跨▼閮借繘鍏ュ悇鑷殑t1()鏂規硶錛屽垎鍒墦鍗板悇鑷殑i
System.out.println(Thread.currentThread().getName()+" "+i);
}
public void run(){
synchronized(this){
while (true) {
t1();
}
}
}
}
--------------------------------------------------------------------------------
涓嬮潰鎴戜滑鏉ヨsynchronized鐨?縐嶇敤娉曞惂:
1.鏂規硶澹版槑鏃朵嬌鐢?鏀懼湪鑼冨洿鎿嶄綔絎?public絳?涔嬪悗,榪斿洖綾誨瀷澹版槑(void絳?涔嬪墠.鍗充竴嬈″彧鑳芥湁涓涓嚎紼嬭繘鍏ヨ鏂規硶,鍏朵粬綰跨▼瑕佹兂鍦ㄦ鏃惰皟鐢ㄨ鏂規硶,鍙兘鎺掗槦絳夊?褰撳墠綰跨▼(灝辨槸鍦╯ynchronized鏂規硶鍐呴儴鐨勭嚎紼?鎵ц瀹岃鏂規硶鍚?鍒殑綰跨▼鎵嶈兘榪涘叆.
渚嬪:
public synchronized void synMethod() {
//鏂規硶浣?br> }
2.瀵規煇涓浠g爜鍧椾嬌鐢?synchronized鍚庤窡鎷彿,鎷彿閲屾槸鍙橀噺,榪欐牱,涓嬈″彧鏈変竴涓嚎紼嬭繘鍏ヨ浠g爜鍧?渚嬪:
public int synMethod(int a1){
synchronized(a1) {
//涓嬈″彧鑳芥湁涓涓嚎紼嬭繘鍏?br> }
}
3.synchronized鍚庨潰鎷彿閲屾槸涓瀵硅薄,姝ゆ椂,綰跨▼鑾峰緱鐨勬槸瀵硅薄閿?渚嬪:
public class MyThread implements Runnable {
public static void main(String args[]) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt, "t1");
Thread t2 = new Thread(mt, "t2");
Thread t3 = new Thread(mt, "t3");
Thread t4 = new Thread(mt, "t4");
Thread t5 = new Thread(mt, "t5");
Thread t6 = new Thread(mt, "t6");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
public void run() {
synchronized (this) {
System.out.println(Thread.currentThread().getName());
}
}
}
瀵逛簬3,濡傛灉綰跨▼榪涘叆,鍒欏緱鍒板璞¢攣,閭d箞鍒殑綰跨▼鍦ㄨ綾繪墍鏈夊璞′笂鐨勪換浣曟搷浣滈兘涓嶈兘榪涜.鍦ㄥ璞$駭浣跨敤閿侀氬父鏄竴縐嶆瘮杈冪矖緋欑殑鏂規硶銆備負浠涔堣灝嗘暣涓璞¢兘涓婇攣錛岃屼笉鍏佽鍏朵粬綰跨▼鐭殏鍦頒嬌鐢ㄥ璞′腑鍏朵粬鍚屾鏂規硶鏉ヨ闂叡浜祫婧愶紵濡傛灉涓涓璞℃嫢鏈夊涓祫婧愶紝灝變笉闇瑕佸彧涓轟簡璁╀竴涓嚎紼嬩嬌鐢ㄥ叾涓竴閮ㄥ垎璧勬簮錛屽氨灝嗘墍鏈夌嚎紼嬮兘閿佸湪澶栭潰銆傜敱浜庢瘡涓璞¢兘鏈夐攣錛屽彲浠ュ涓嬫墍紺轟嬌鐢ㄨ櫄鎷熷璞℃潵涓婇攣錛?/p>
class FineGrainLock {
MyMemberClass x, y;
Object xlock = new Object(), ylock = new Object();
public void foo() {
synchronized(xlock) {
//access x here
}
//do something here - but don't use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here - but don't use shared resources
}
}
4.synchronized鍚庨潰鎷彿閲屾槸綾?渚嬪:
class ArrayWithLockOrder{
private static long num_locks = 0;
private long lock_order;
private int[] arr;
public ArrayWithLockOrder(int[] a)
{
arr = a;
synchronized(ArrayWithLockOrder.class) {//-----------------------------------------榪欓噷
num_locks++; // 閿佹暟鍔?1銆?br> lock_order = num_locks; // 涓烘瀵硅薄瀹炰緥璁劇疆鍞竴鐨?lock_order銆?br> }
}
public long lockOrder()
{
return lock_order;
}
public int[] array()
{
return arr;
}
}
class SomeClass implements Runnable
{
public int sumArrays(ArrayWithLockOrder a1,
ArrayWithLockOrder a2)
{
int value = 0;
ArrayWithLockOrder first = a1; // 淇濈暀鏁扮粍寮曠敤鐨勪竴涓?br> ArrayWithLockOrder last = a2; // 鏈湴鍓湰銆?br> int size = a1.array().length;
if (size == a2.array().length)
{
if (a1.lockOrder() > a2.lockOrder()) // 紜畾騫惰緗璞$殑閿佸畾
{ // 欏哄簭銆?br> first = a2;
last = a1;
}
synchronized(first) { // 鎸夋紜殑欏哄簭閿佸畾瀵硅薄銆?br> synchronized(last) {
int[] arr1 = a1.array();
int[] arr2 = a2.array();
for (int i=0; i<size; i++)
value += arr1[i] + arr2[i];
}
}
}
return value;
}
public void run() {
//...
}
}
瀵逛簬4,濡傛灉綰跨▼榪涘叆,鍒欑嚎紼嬪湪璇ョ被涓墍鏈夋搷浣滀笉鑳借繘琛?鍖呮嫭闈欐佸彉閲忓拰闈欐佹柟娉?瀹為檯涓?瀵逛簬鍚湁闈欐佹柟娉曞拰闈欐佸彉閲忕殑浠g爜鍧楃殑鍚屾,鎴戜滑閫氬父鐢?鏉ュ姞閿?
浠ヤ笂4縐嶄箣闂寸殑鍏崇郴錛?/p>
閿佹槸鍜屽璞$浉鍏寵仈鐨勶紝姣忎釜瀵硅薄鏈変竴鎶婇攣錛屼負浜嗘墽琛宻ynchronized璇彞錛岀嚎紼嬪繀欏昏兘澶熻幏寰梥ynchronized璇彞涓〃杈懼紡鎸囧畾鐨勫璞$殑閿侊紝涓涓璞″彧鏈変竴鎶婇攣錛岃涓涓嚎紼嬭幏寰椾箣鍚庡畠灝變笉鍐嶆嫢鏈夎繖鎶婇攣錛岀嚎紼嬪湪鎵ц瀹宻ynchronized璇彞鍚庯紝灝嗚幏寰楅攣浜よ繕緇欏璞°?br> 鍦ㄦ柟娉曞墠闈㈠姞涓妔ynchronized淇グ絎﹀嵆鍙互灝嗕竴涓柟娉曞0鏄庝負鍚屾鍖栨柟娉曘傚悓姝ュ寲鏂規硶鍦ㄦ墽琛屼箣鍓嶈幏寰椾竴涓攣銆傚鏋滆繖鏄竴涓被鏂規硶錛岄偅涔堣幏寰楃殑閿佹槸鍜屽0鏄庢柟娉曠殑綾葷浉鍏崇殑Class綾誨璞$殑閿併傚鏋滆繖鏄竴涓疄渚嬫柟娉曪紝閭d箞姝ら攣鏄痶his瀵硅薄鐨勯攣銆?/p>
--------------------------------------------------------------------------------
涓嬮潰璋堜竴璋堜竴浜涘父鐢ㄧ殑鏂規硶:
wait(),wait(long),notify(),notifyAll()絳夋柟娉曟槸褰撳墠綾葷殑瀹炰緥鏂規硶,
wait()鏄嬌鎸佹湁瀵硅薄閿佺殑綰跨▼閲婃斁閿?
wait(long)鏄嬌鎸佹湁瀵硅薄閿佺殑綰跨▼閲婃斁閿佹椂闂翠負long(姣)鍚?鍐嶆鑾峰緱閿?wait()鍜寃ait(0)絳変環;
notify()鏄敜閱掍竴涓鍦ㄧ瓑寰呰瀵硅薄閿佺殑綰跨▼,濡傛灉絳夊緟鐨勭嚎紼嬩笉姝竴涓?閭d箞琚敜閱掔殑綰跨▼鐢眏vm紜畾;
notifyAll鏄敜閱掓墍鏈夋鍦ㄧ瓑寰呰瀵硅薄閿佺殑綰跨▼.
鍦ㄨ繖閲屾垜涔熼噸鐢充竴涓?鎴戜滑搴旇浼樺厛浣跨敤notifyAll()鏂規硶,鍥犱負鍞ら啋鎵鏈夌嚎紼嬫瘮鍞ら啋涓涓嚎紼嬫洿瀹規槗璁﹋vm鎵懼埌鏈閫傚悎琚敜閱掔殑綰跨▼.
瀵逛簬涓婅堪鏂規硶,鍙湁鍦ㄥ綋鍓嶇嚎紼嬩腑鎵嶈兘浣跨敤,鍚﹀垯鎶ヨ繍琛屾椂閿欒java.lang.IllegalMonitorStateException: current thread not owner.
--------------------------------------------------------------------------------
涓嬮潰,鎴戣皥涓涓媠ynchronized鍜寃ait()銆乶otify()絳夌殑鍏崇郴:
1.鏈塻ynchronized鐨勫湴鏂逛笉涓瀹氭湁wait,notify
2.鏈墂ait,notify鐨勫湴鏂瑰繀鏈塻ynchronized.榪欐槸鍥犱負wait鍜宯otify涓嶆槸灞炰簬綰跨▼綾伙紝鑰屾槸姣忎竴涓璞¢兘鍏鋒湁鐨勬柟娉曪紝鑰屼笖錛岃繖涓や釜鏂規硶閮藉拰瀵硅薄閿佹湁鍏籌紝鏈夐攣鐨勫湴鏂癸紝蹇呮湁synchronized銆?/p>
鍙﹀錛岃娉ㄦ剰涓鐐癸細濡傛灉瑕佹妸notify鍜寃ait鏂規硶鏀懼湪涓璧風敤鐨勮瘽錛屽繀欏誨厛璋冪敤notify鍚庤皟鐢╳ait錛屽洜涓哄鏋滆皟鐢ㄥ畬wait錛岃綰跨▼灝卞凡緇忎笉鏄痗urrent thread浜嗐傚涓嬩緥錛?/p>
/**
* Title: Jdeveloper's Java Projdect
* Description: n/a
* Copyright: Copyright (c) 2001
* Company: soho http://www.ChinaJavaWorld.com
* @author jdeveloper@21cn.com
* @version 1.0
*/
import java.lang.Runnable;
import java.lang.Thread;
public class DemoThread
implements Runnable {
public DemoThread() {
TestThread testthread1 = new TestThread(this, "1");
TestThread testthread2 = new TestThread(this, "2");
testthread2.start();
testthread1.start();
}
public static void main(String[] args) {
DemoThread demoThread1 = new DemoThread();
}
public void run() {
TestThread t = (TestThread) Thread.currentThread();
try {
if (!t.getName().equalsIgnoreCase("1")) {
synchronized (this) {
wait();
}
}
while (true) {
System.out.println("@time in thread" + t.getName() + "=" +
t.increaseTime());
if (t.getTime() % 10 == 0) {
synchronized (this) {
System.out.println("****************************************");
notify();
if (t.getTime() == 100)
break;
wait();
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
class TestThread
extends Thread {
private int time = 0;
public TestThread(Runnable r, String name) {
super(r, name);
}
public int getTime() {
return time;
}
public int increaseTime() {
return++time;
}
}
涓嬮潰鎴戜滑鐢ㄧ敓浜ц?娑堣垂鑰呰繖涓緥瀛愭潵璇存槑浠栦滑涔嬮棿鐨勫叧緋?
public class test {
public static void main(String args[]) {
Semaphore s = new Semaphore(1);
Thread t1 = new Thread(s, "producer1");
Thread t2 = new Thread(s, "producer2");
Thread t3 = new Thread(s, "producer3");
Thread t4 = new Thread(s, "consumer1");
Thread t5 = new Thread(s, "consumer2");
Thread t6 = new Thread(s, "consumer3");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
}
class Semaphore
implements Runnable {
private int count;
public Semaphore(int n) {
this.count = n;
}
public synchronized void acquire() {
while (count == 0) {
try {
wait();
}
catch (InterruptedException e) {
//keep trying
}
}
count--;
}
public synchronized void release() {
while (count == 10) {
try {
wait();
}
catch (InterruptedException e) {
//keep trying
}
}
count++;
notifyAll(); //alert a thread that's blocking on this semaphore
}
public void run() {
while (true) {
if (Thread.currentThread().getName().substring(0,8).equalsIgnoreCase("consumer")) {
acquire();
}
else if (Thread.currentThread().getName().substring(0,8).equalsIgnoreCase("producer")) {
release();
}
System.out.println(Thread.currentThread().getName() + " " + count);
}
}
}
鐢熶駭鑰呯敓浜?娑堣垂鑰呮秷璐?涓鑸病鏈夊啿紿?浣嗗綋搴撳瓨涓?鏃?娑堣垂鑰呰娑堣垂鏄笉琛岀殑,浣嗗綋搴撳瓨涓轟笂闄?榪欓噷鏄?0)鏃?鐢熶駭鑰呬篃涓嶈兘鐢熶駭.璇峰ソ濂界爺璇諱笂闈㈢殑紼嬪簭,浣犱竴瀹氫細姣斾互鍓嶈繘姝ュ緢澶?
涓婇潰鐨勪唬鐮佽鏄庝簡synchronized鍜寃ait,notify娌℃湁緇濆鐨勫叧緋?鍦╯ynchronized澹版槑鐨勬柟娉曘佷唬鐮佸潡涓?浣犲畬鍏ㄥ彲浠ヤ笉鐢╳ait,notify絳夋柟娉?浣嗘槸,濡傛灉褰撶嚎紼嬪鏌愪竴璧勬簮瀛樺湪鏌愮浜夌敤鐨勬儏鍐典笅,浣犲繀欏婚傛椂寰楀皢綰跨▼鏀懼叆絳夊緟鎴栬呭敜閱?
--------------------------------------------------------------------------------
鏂囩珷緇堜簬鍐欏畬浜?鍩烘湰涓婂皢鎴戝涔犳墍寰楀叏閮ㄥ啓鍑烘潵浜?涓嶈繃涔熺暀涓嬩簺璁擱仐鎲?姣斿synchronized鍚庢槸綾繪椂鐨勬繁鍏ョ殑璇存槑鍙婅璁?鑰屼笖,鏂囩珷鐢變簬鑷繁鑳藉姏鏈夐檺,鏈変簺鍦版柟鑲畾浼氭湁閿欒,甯屾湜鐪嬭繃鏈変綍寤鴻鍜屾壒璇?璇峰彂甯栧湪涓嬮潰,鎴戜細淇璇ユ枃.璋㈣阿!
byte 鈥斺斻塩har錛?br>"浣?鐨刧b鐮佹槸錛?xc4e3 ,unicode鏄?x4f60
String encoding = "gb2312";
byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};
ByteToCharConverter converter =
ByteToCharConverter.getConverter(encoding);
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
緇撴灉鏄粈涔堬紵0x4f60
濡傛灉encoding ="8859_1"錛岀粨鏋滃張鏄粈涔堬紵0x00c4,0x00e3
濡傛灉浠g爜鏀逛負
byte b[] = {(byte)'\u00c4',(byte)'\u00e3'};
ByteToCharConverter converter = ByteToCharConverter. getDefault();
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
緇撴灉灝嗗張鏄粈涔堬紵鏍規嵁騫沖彴鐨勭紪鐮佽屽畾銆?/p>
char 鈥斺斻塨yte錛?br>String encoding = "gb2312";
char c[] = {'\u4f60'};
CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
緇撴灉鏄粈涔堬紵0x00c4,0x00e3
濡傛灉encoding ="8859_1"錛岀粨鏋滃張鏄粈涔堬紵0x3f
濡傛灉浠g爜鏀逛負
String encoding = "gb2312";
char c[] = {'\u4f60'};
CharToByteConverter converter = CharToByteConverter.getDefault();
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
緇撴灉灝嗗張鏄粈涔堬紵鏍規嵁騫沖彴鐨勭紪鐮佽屽畾銆?br>寰堝涓枃闂灝辨槸浠庤繖涓や釜鏈綆鍗曠殑綾繪淳鐢熷嚭鏉ョ殑銆傝屽嵈鏈夊緢澶氱被涓嶇洿鎺ユ敮鎸佹妸encoding杈撳叆錛岃繖緇欐垜浠甫鏉ヨ澶氫笉渚褲傚緢澶氱▼搴忛毦寰楃敤encoding浜嗭紝鐩存帴鐢╠efault鐨別ncoding錛岃繖灝辯粰鎴戜滑縐繪甯︽潵浜嗗緢澶氬洶闅俱?/p>
2.utf-8
utf-8鏄拰unicode涓涓瀵瑰簲鐨勶紝鍏跺疄鐜板緢綆鍗?br>7浣嶇殑unicode: 0 _ _ _ _ _ _ _
11浣嶇殑unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
16浣嶇殑unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
21浣嶇殑unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
澶у鏁版儏鍐墊槸鍙嬌鐢ㄥ埌16浣嶄互涓嬬殑unicode:
"浣?鐨刧b鐮佹槸錛?xc4e3 ,unicode鏄?x4f60
0xc4e3鐨勪簩榪涘埗錛?br>1100 錛?100 錛?110 錛?011
鐢變簬鍙湁涓や綅鎴戜滑鎸夌収涓や綅鐨勭紪鐮佹潵鎺掞紝浣嗘槸鎴戜滑鍙戠幇榪欒涓嶉氾紝鍥犱負絎紬浣嶄笉鏄?鍥犳錛岃繑鍥??"
0x4f60鐨勪簩榪涘埗錛?br>0100 錛?111 錛?110 錛?000
鎴戜滑鐢╱tf-8琛ラ綈錛屽彉鎴愶細
1110 錛?100 錛?011 錛?101 錛?010 錛?000
e4--bd-- a0
浜庢槸榪斿洖錛?xe4,0xbd,0xa0銆?/p>
3.string鍜宐yte[]
string鍏跺疄鏍稿績鏄痗har[],鐒惰岃鎶奲yte杞寲鎴恠tring錛屽繀欏葷粡榪囩紪鐮併俿tring.length()鍏跺疄灝辨槸char鏁扮粍鐨勯暱搴︼紝濡傛灉浣跨敤涓嶅悓鐨勭紪鐮侊紝寰堝彲鑳戒細閿欏垎錛岄犳垚鏁e瓧鍜屼貢鐮併?br>渚嬪錛?br>String encoding = “”;
byte [] b={(byte)'\u00c4',(byte)'\u00e3'};
String str=new String(b,encoding);銆銆
濡傛灉encoding=8859_1錛屼細鏈変袱涓瓧錛屼絾鏄痚ncoding=gb2312鍙湁涓涓瓧榪欎釜闂鍦ㄥ鐞嗗垎欏墊槸緇忓父鍙戠敓 銆?/p>
4.Reader,Writer / InputStream,OutputStream
Reader鍜學riter鏍稿績鏄痗har錛孖nputStream鍜孫utputStream鏍稿績鏄痓yte銆備絾鏄疪eader鍜學riter鐨勪富瑕佺洰鐨勬槸瑕佹妸char璇?鍐橧nputStream/OutputStream銆?br>渚嬪錛?br>鏂囦歡test.txt鍙湁涓涓?浣?瀛楋紝0xc4,0xe3
String encoding = "gb2312";
InputStreamReader reader = new InputStreamReader(new FileInputStream(
"text.txt"), encoding);
char c[] = new char[10];
int length = reader.read(c);
for (int i = 0; i < length; i++) {
System.out.println(c[i]);
}
緇撴灉鏄粈涔堬紵浣?br>濡傛灉encoding ="8859_1"錛岀粨鏋滄槸浠涔堬紵??涓や釜瀛楃錛岃〃紺轟笉璁よ瘑銆?br>鍙嶈繃鏉ョ殑渚嬪瓙鑷繁鍋氥?/p>
5.鎴戜滑瑕佸java鐨勭紪璇戝櫒鏈夋墍浜嗚В 錛?br>javac ?encoding
鎴戜滑甯稿父娌℃湁鐢ㄥ埌encoding榪欎釜鍙傛暟銆傚叾瀹瀍ncoding榪欎釜鍙傛暟瀵逛簬璺ㄥ鉤鍙扮殑鎿嶄綔鏄緢閲嶈鐨勩傚鏋滄病鏈夋寚瀹歟ncoding錛屽垯鎸夌収緋葷粺鐨勯粯璁ncoding,gb騫沖彴涓婃槸gb2312錛岃嫳鏂囧鉤鍙頒笂鏄痠so8859_1銆?br>java 鐨勭紪璇戝櫒瀹為檯涓婃槸璋冪敤sun.tools.javac.main鐨勭被錛屽鏂囦歡榪涜緙栬瘧錛岃繖涓被鏈塩ompile鍑芥暟涓棿鏈変竴涓猠ncoding鐨勫彉閲?- encoding鐨勫弬鏁板叾瀹炵洿鎺ヤ紶緇檈ncoding鍙橀噺銆傜紪璇戝櫒灝辨槸鏍規嵁榪欎釜鍙橀噺鏉ヨ鍙杍ava鏂囦歡鐨勶紝鐒跺悗鎶婄敤utf-8褰㈠紡緙栬瘧鎴恈lass鏂囦歡銆?br>渚嬪瓙浠g爜錛?br>String str = "浣?;
FileWriter writer = new FileWriter("text.txt");
write.write(str);
writer.close();
濡傛灉鐢╣b2312緙栬瘧錛屼綘浼氭壘鍒癳4 bd a0鐨勫瓧孌?錛?br>濡傛灉鐢?859_1緙栬瘧錛?00c4 00e3鐨勪簩榪涘埗錛?br>0000錛?000 錛?100錛?100 錛?000錛?000 錛?110錛?011
鍥犱負姣忎釜瀛楃閮藉ぇ浜?浣嶏紝鍥犳鐢?1浣嶇紪鐮侊細
1100錛?001錛?000錛?100錛?100錛?011錛?010錛?011
c1-- 84--銆c3--銆 a3
浣犱細鎵懼埌c1 84 c3 a3 銆?/p>
浣嗘槸鎴戜滑寰寰蹇界暐鎺夎繖涓弬鏁幫紝鍥犳榪欐牱寰寰浼氭湁璺ㄥ鉤鍙扮殑闂錛?br>鏍蜂緥浠g爜鍦ㄤ腑鏂囧鉤鍙頒笂緙栬瘧錛岀敓鎴恴hclass
鏍蜂緥浠g爜鍦ㄨ嫳鏂囧鉤鍙頒笂緙栬瘧錛岃緭鍑篹nclass
(1).銆 zhclass鍦ㄤ腑鏂囧鉤鍙頒笂鎵цok,浣嗘槸鍦ㄨ嫳鏂囧鉤鍙頒笂涓嶈
(2). enclass鍦ㄨ嫳鏂囧鉤鍙頒笂鎵цok,浣嗘槸鍦ㄤ腑鏂囧鉤鍙頒笂涓嶈
鍘熷洜錛?br>(1). 鍦ㄤ腑鏂囧鉤鍙頒笂緙栬瘧鍚庯紝鍏跺疄str鍦ㄨ繍琛屾佺殑char[]鏄?x4f60,銆鍦ㄤ腑鏂囧鉤鍙頒笂榪愯錛宖ilewriter鐨勭己鐪佺紪鐮佹槸gb2312,鍥犳 chartobyteconverter浼氳嚜鍔ㄧ敤璋冪敤gb2312鐨刢onverter,鎶妔tr杞寲鎴恇yte杈撳叆鍒癴ileoutputstream 涓紝浜庢槸0xc4,0xe3鏀捐繘浜嗘枃浠躲?br>浣嗘槸濡傛灉鏄湪鑻辨枃騫沖彴涓嬶紝chartobyteconverter鐨勭己鐪佸兼槸8859_1, filewriter浼氳嚜鍔ㄨ皟鐢?859_1鍘昏漿鍖杝tr,浣嗘槸浠栨棤娉曡В閲婏紝鍥犳浠栦細杈撳嚭"?"
(2). 鍦ㄨ嫳鏂囧鉤鍙頒笂緙栬瘧鍚庯紝鍏跺疄str鍦ㄨ繍琛屾佺殑char[]鏄?x00c4 0x00e3, 鍦ㄤ腑鏂囧鉤鍙頒笂榪愯錛屼腑鏂囨棤娉曡瘑鍒紝鍥犳浼氬嚭鐜??錛?br>鍦ㄨ嫳鏂囧鉤鍙頒笂錛?x00c4-->0xc4,0x00e3->0xe3錛屽洜姝?xc4,0xe3琚斁榪涗簡鏂囦歡銆?/p>
6. 鍏跺畠鍘熷洜錛?
璁劇疆嫻忚鍣ㄧ殑鏄劇ず緙栫爜錛屽鏋渞esponse鐨勬暟鎹槸utf8緙栫爜錛屾樉紺哄皢鏄貢鐮侊紝浣嗘槸涔辯爜鍜屼笂榪板師鍥犺繕涓嶄竴鏍楓?/p>
7. 鍙戠敓緙栫爜鐨勫湴鏂?錛?br>? 浠庢暟鎹簱鍒癹ava紼嬪簭 byte鈥斺斻塩har
? 浠巎ava紼嬪簭鍒版暟鎹簱 char鈥斺斻塨yte
? 浠庢枃浠跺埌java紼嬪簭 byte鈥斺斻塩har
? 浠巎ava紼嬪簭鍒版枃浠?char鈥斺斻塨yte
? 浠巎ava紼嬪簭鍒伴〉闈㈡樉紺?char鈥斺斻塨yte
? 浠庨〉闈orm鎻愪氦鏁版嵁鍒癹ava紼嬪簭byte鈥斺斻塩har
? 浠庢祦鍒癹ava紼嬪簭byte鈥斺斻塩har
? 浠巎ava紼嬪簭鍒版祦char鈥斺斻塨yte
璋㈠織閽㈢殑瑙e喅鏂規硶錛?br>鎴戞槸浣跨敤閰嶇疆榪囨護鍣ㄧ殑鏂規硶瑙e喅涓枃涔辯爜鐨勶細
錛渨eb-app>
錛渇ilter>
錛渇ilter-name>RequestFilter
錛渇ilter-class>net.golden.uirs.util.RequestFilter
錛渋nit-param>
錛減aram-name>charset
錛減aram-value>gb2312
錛?init-param>
錛?filter>
錛渇ilter-mapping>
錛渇ilter-name>RequestFilter
錛渦rl-pattern>*.jsp
錛?filter-mapping>
錛?web-app>
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain fChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); // 璁劇疆瀛楃闆嗭紵
瀹為檯涓婃槸璁劇疆浜哹yte 鈥斺斻塩har鐨別ncoding
try {
if (userId == null || userId.equals("")) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) {
session.invalidate();
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.jsp");
}
}
else { // 鐪嬬湅鏄惁鍏鋒湁淇℃伅涓婃姤緋葷粺鐨勬潈闄?br>if (!net.golden.uirs.util.UirsChecker.check(userId, "淇℃伅涓婃姤緋葷粺",
net.golden.uirs.util.UirsChecker.ACTION_DO)) {
if (!request.getRequestURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2Ejsp$")) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logonController.jsp");
}
}
}
}
catch (Exception ex) {
response.sendRedirect(request.getContextPath() +
"/uirs/logon/logon.jsp");
}
fChain.doFilter(req, res);
}
Reflection 鏄?Java 紼嬪簭寮鍙戣璦鐨勭壒寰佷箣涓錛屽畠鍏佽榪愯涓殑 Java 紼嬪簭瀵硅嚜韜繘琛屾鏌ワ紝鎴栬呰“鑷”錛屽茍鑳界洿鎺ユ搷浣滅▼搴忕殑鍐呴儴灞炴с備緥濡傦紝浣跨敤瀹冭兘鑾峰緱 Java 綾諱腑鍚勬垚鍛樼殑鍚嶇О騫舵樉紺哄嚭鏉ャ?/p>
Java 鐨勮繖涓鑳藉姏鍦ㄥ疄闄呭簲鐢ㄤ腑涔熻鐢ㄥ緱涓嶆槸寰堝錛屼絾鏄湪鍏跺畠鐨勭▼搴忚璁¤璦涓牴鏈氨涓嶅瓨鍦ㄨ繖涓鐗規с備緥濡傦紝Pascal銆丆 鎴栬?C++ 涓氨娌℃湁鍔炴硶鍦ㄧ▼搴忎腑鑾峰緱鍑芥暟瀹氫箟鐩稿叧鐨勪俊鎭?/p>
JavaBean 鏄?reflection 鐨勫疄闄呭簲鐢ㄤ箣涓錛屽畠鑳借涓浜涘伐鍏峰彲瑙嗗寲鐨勬搷浣滆蔣浠剁粍浠躲傝繖浜涘伐鍏烽氳繃 reflection 鍔ㄦ佺殑杞藉叆騫跺彇寰?Java 緇勪歡(綾? 鐨勫睘鎬с?/p>
涓涓畝鍗曠殑渚嬪瓙
鑰冭檻涓嬮潰榪欎釜綆鍗曠殑渚嬪瓙錛岃鎴戜滑鐪嬬湅 reflection 鏄浣曞伐浣滅殑銆?/p>
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName(args[0]);
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
}
catch (Throwable e) {
System.err.println(e);
}
}
}
鎸夊涓嬭鍙ユ墽琛岋細
java DumpMethods java.util.Stack
瀹冪殑緇撴灉杈撳嚭涓猴細
public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)
榪欐牱灝卞垪鍑轟簡java.util.Stack 綾葷殑鍚勬柟娉曞悕浠ュ強瀹冧滑鐨勯檺鍒剁鍜岃繑鍥炵被鍨嬨?/p>
榪欎釜紼嬪簭浣跨敤 Class.forName 杞藉叆鎸囧畾鐨勭被錛岀劧鍚庤皟鐢?getDeclaredMethods 鏉ヨ幏鍙栬繖涓被涓畾涔変簡鐨勬柟娉曞垪琛ㄣ俲ava.lang.reflect.Methods 鏄敤鏉ユ弿榪版煇涓被涓崟涓柟娉曠殑涓涓被銆?/p>
寮濮嬩嬌鐢?Reflection
鐢ㄤ簬 reflection 鐨勭被錛屽 Method錛屽彲浠ュ湪 java.lang.relfect 鍖呬腑鎵懼埌銆備嬌鐢ㄨ繖浜涚被鐨勬椂鍊欏繀欏昏閬靛驚涓変釜姝ラ錛氱涓姝ユ槸鑾峰緱浣犳兂鎿嶄綔鐨勭被鐨?java.lang.Class 瀵硅薄銆傚湪榪愯涓殑 Java 紼嬪簭涓紝鐢?java.lang.Class 綾繪潵鎻忚堪綾誨拰鎺ュ彛絳夈?/p>
涓嬮潰灝辨槸鑾峰緱涓涓?Class 瀵硅薄鐨勬柟娉曚箣涓錛?/p>
Class c = Class.forName("java.lang.String");
榪欐潯璇彞寰楀埌涓涓?String 綾葷殑綾誨璞°傝繕鏈夊彟涓縐嶆柟娉曪紝濡備笅闈㈢殑璇彞錛?/p>
Class c = int.class;
鎴栬?/p>
Class c = Integer.TYPE;
瀹冧滑鍙幏寰楀熀鏈被鍨嬬殑綾諱俊鎭傚叾涓悗涓縐嶆柟娉曚腑璁塊棶鐨勬槸鍩烘湰綾誨瀷鐨勫皝瑁呯被 (濡?Integer) 涓鍏堝畾涔夊ソ鐨?TYPE 瀛楁銆?/p>
絎簩姝ユ槸璋冪敤璇稿 getDeclaredMethods 鐨勬柟娉曪紝浠ュ彇寰楄綾諱腑瀹氫箟鐨勬墍鏈夋柟娉曠殑鍒楄〃銆?/p>
涓鏃﹀彇寰楄繖涓俊鎭紝灝卞彲浠ヨ繘琛岀涓夋浜嗏斺斾嬌鐢?reflection API 鏉ユ搷浣滆繖浜涗俊鎭紝濡備笅闈㈣繖孌典唬鐮侊細
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
瀹冨皢浠ユ枃鏈柟寮忔墦鍗板嚭 String 涓畾涔夌殑絎竴涓柟娉曠殑鍘熷瀷銆?/p>
鍦ㄤ笅闈㈢殑渚嬪瓙涓紝榪欎笁涓楠ゅ皢涓轟嬌鐢?reflection 澶勭悊鐗規畩搴旂敤紼嬪簭鎻愪緵渚嬭瘉銆?/p>
妯℃嫙 instanceof 鎿嶄綔絎?/p>
寰楀埌綾諱俊鎭箣鍚庯紝閫氬父涓嬩竴涓楠ゅ氨鏄В鍐沖叧浜?Class 瀵硅薄鐨勪竴浜涘熀鏈殑闂銆備緥濡傦紝Class.isInstance 鏂規硶鍙互鐢ㄤ簬妯℃嫙 instanceof 鎿嶄綔絎︼細
class A {}
public class instance1 {
public static void main(String args[])
{
try {
Class cls = Class.forName("A");
boolean b1
= cls.isInstance(new Integer(37));
System.out.println(b1);
boolean b2 = cls.isInstance(new A());
System.out.println(b2);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
鍦ㄨ繖涓緥瀛愪腑鍒涘緩浜嗕竴涓?A 綾葷殑 Class 瀵硅薄錛岀劧鍚庢鏌ヤ竴浜涘璞℃槸鍚︽槸 A 鐨勫疄渚嬨侷nteger(37) 涓嶆槸錛屼絾 new A() 鏄?/p>
鎵懼嚭綾葷殑鏂規硶
鎵懼嚭涓涓被涓畾涔変簡浜涗粈涔堟柟娉曪紝榪欐槸涓涓潪甯告湁浠峰間篃闈炲父鍩虹鐨?reflection 鐢ㄦ硶銆備笅闈㈢殑浠g爜灝卞疄鐜頒簡榪欎竴鐢ㄦ硶錛?/p>
import java.lang.reflect.*;
public class method1 {
private int f1(Object p, int x) throws NullPointerException
{
if (p == null)
throw new NullPointerException();
return x;
}
public static void main(String args[])
{
try {
Class cls = Class.forName("method1");
Method methlist[]
= cls.getDeclaredMethods();
for (int i = 0; i < methlist.length;
i++) {
Method m = methlist[i];
System.out.println("name
= " + m.getName());
System.out.println("decl class = " +
m.getDeclaringClass());
Class pvec[] = m.getParameterTypes();
for (int j = 0; j < pvec.length; j++)
System.out.println("
param #" + j + " " + pvec[j]);
Class evec[] = m.getExceptionTypes();
for (int j = 0; j < evec.length; j++)
System.out.println("exc #" + j
+ " " + evec[j]);
System.out.println("return type = " +
m.getReturnType());
System.out.println("-----");
}
}
catch (Throwable e) {
System.err.println(e);
}
}
}
榪欎釜紼嬪簭棣栧厛鍙栧緱 method1 綾葷殑鎻忚堪錛岀劧鍚庤皟鐢?getDeclaredMethods 鏉ヨ幏鍙栦竴緋誨垪鐨?Method 瀵硅薄錛屽畠浠垎鍒弿榪頒簡瀹氫箟鍦ㄧ被涓殑姣忎竴涓柟娉曪紝鍖呮嫭 public 鏂規硶銆乸rotected 鏂規硶銆乸ackage 鏂規硶鍜?private 鏂規硶絳夈傚鏋滀綘鍦ㄧ▼搴忎腑浣跨敤 getMethods 鏉ヤ唬鏇?getDeclaredMethods錛屼綘榪樿兘鑾峰緱緇ф壙鏉ョ殑鍚勪釜鏂規硶鐨勪俊鎭?/p>
鍙栧緱浜?Method 瀵硅薄鍒楄〃涔嬪悗錛岃鏄劇ず榪欎簺鏂規硶鐨勫弬鏁扮被鍨嬨佸紓甯哥被鍨嬪拰榪斿洖鍊肩被鍨嬬瓑灝變笉闅句簡銆傝繖浜涚被鍨嬫槸鍩烘湰綾誨瀷榪樻槸綾葷被鍨嬶紝閮藉彲浠ョ敱鎻忚堪綾葷殑瀵硅薄鎸夐『搴忕粰鍑恒?/p>
杈撳嚭鐨勭粨鏋滃涓嬶細
name = f1
decl class = class method1
param #0 class java.lang.Object
param #1 int
exc #0 class java.lang.NullPointerException
return type = int
-----
name = main
decl class = class method1
param #0 class [Ljava.lang.String;
return type = void
-----
鑾峰彇鏋勯犲櫒淇℃伅
鑾峰彇綾繪瀯閫犲櫒鐨勭敤娉曚笌涓婅堪鑾峰彇鏂規硶鐨勭敤娉曠被浼鹼紝濡傦細
import java.lang.reflect.*;
public class constructor1 {
public constructor1()
{
}
protected constructor1(int i, double d)
{
}
public static void main(String args[])
{
try {
Class cls = Class.forName("constructor1");
Constructor ctorlist[]
= cls.getDeclaredConstructors();
for (int i = 0; i < ctorlist.length; i++) {
Constructor ct = ctorlist[i];
System.out.println("name
= " + ct.getName());
System.out.println("decl class = " +
ct.getDeclaringClass());
Class pvec[] = ct.getParameterTypes();
for (int j = 0; j < pvec.length; j++)
System.out.println("param #"
+ j + " " + pvec[j]);
Class evec[] = ct.getExceptionTypes();
for (int j = 0; j < evec.length; j++)
System.out.println(
"exc #" + j + " " + evec[j]);
System.out.println("-----");
}
}
catch (Throwable e) {
System.err.println(e);
}
}
}
榪欎釜渚嬪瓙涓病鑳借幏寰楄繑鍥炵被鍨嬬殑鐩稿叧淇℃伅錛岄偅鏄洜涓烘瀯閫犲櫒娌℃湁榪斿洖綾誨瀷銆?/p>
榪欎釜紼嬪簭榪愯鐨勭粨鏋滄槸錛?/p>
name = constructor1
decl class = class constructor1
-----
name = constructor1
decl class = class constructor1
param #0 int
param #1 double
-----
鑾峰彇綾葷殑瀛楁(鍩?
鎵懼嚭涓涓被涓畾涔変簡鍝簺鏁版嵁瀛楁涔熸槸鍙兘鐨勶紝涓嬮潰鐨勪唬鐮佸氨鍦ㄥ共榪欎釜浜嬫儏錛?/p>
import java.lang.reflect.*;
public class field1 {
private double d;
public static final int i = 37;
String s = "testing";
public static void main(String args[])
{
try {
Class cls = Class.forName("field1");
Field fieldlist[]
= cls.getDeclaredFields();
for (int i
= 0; i < fieldlist.length; i++) {
Field fld = fieldlist[i];
System.out.println("name
= " + fld.getName());
System.out.println("decl class = " +
fld.getDeclaringClass());
System.out.println("type
= " + fld.getType());
int mod = fld.getModifiers();
System.out.println("modifiers = " +
Modifier.toString(mod));
System.out.println("-----");
}
}
catch (Throwable e) {
System.err.println(e);
}
}
}
榪欎釜渚嬪瓙鍜屽墠闈㈤偅涓緥瀛愰潪甯哥浉浼箋備緥涓嬌鐢ㄤ簡涓涓柊涓滆タ Modifier錛屽畠涔熸槸涓涓?reflection 綾伙紝鐢ㄦ潵鎻忚堪瀛楁鎴愬憳鐨勪慨楗拌錛屽“private int”銆傝繖浜涗慨楗拌鑷韓鐢辨暣鏁版弿榪幫紝鑰屼笖浣跨敤 Modifier.toString 鏉ヨ繑鍥炰互“瀹樻柟”欏哄簭鎺掑垪鐨勫瓧絎︿覆鎻忚堪 (濡?#8220;static”鍦?#8220;final”涔嬪墠)銆傝繖涓▼搴忕殑杈撳嚭鏄細
name = d
decl class = class field1
type = double
modifiers = private
-----
name = i
decl class = class field1
type = int
modifiers = public static final
-----
name = s
decl class = class field1
type = class java.lang.String
modifiers =
-----
鍜岃幏鍙栨柟娉曠殑鎯呭喌涓涓嬶紝鑾峰彇瀛楁鐨勬椂鍊欎篃鍙互鍙彇寰楀湪褰撳墠綾諱腑鐢蟲槑浜嗙殑瀛楁淇℃伅 (getDeclaredFields)錛屾垨鑰呬篃鍙互鍙栧緱鐖剁被涓畾涔夌殑瀛楁 (getFields) 銆?/p>
鏍規嵁鏂規硶鐨勫悕縐版潵鎵ц鏂規硶
鏂囨湰鍒拌繖閲岋紝鎵涓劇殑渚嬪瓙鏃犱竴渚嬪閮戒笌濡備綍鑾峰彇綾葷殑淇℃伅鏈夊叧銆傛垜浠篃鍙互鐢?reflection 鏉ュ仛涓浜涘叾瀹冪殑浜嬫儏錛屾瘮濡傛墽琛屼竴涓寚瀹氫簡鍚嶇О鐨勬柟娉曘備笅闈㈢殑紺轟緥婕旂ず浜嗚繖涓鎿嶄綔錛?/p>
import java.lang.reflect.*;
public class method2 {
public int add(int a, int b)
{
return a + b;
}
public static void main(String args[])
{
try {
Class cls = Class.forName("method2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod(
"add", partypes);
method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj
= meth.invoke(methobj, arglist);
Integer retval = (Integer)retobj;
System.out.println(retval.intValue());
}
catch (Throwable e) {
System.err.println(e);
}
}
}
鍋囧涓涓▼搴忓湪鎵ц鐨勬煇澶勭殑鏃跺欐墠鐭ラ亾闇瑕佹墽琛屾煇涓柟娉曪紝榪欎釜鏂規硶鐨勫悕縐版槸鍦ㄧ▼搴忕殑榪愯榪囩▼涓寚瀹氱殑 (渚嬪錛孞avaBean 寮鍙戠幆澧冧腑灝變細鍋氳繖鏍風殑浜?錛岄偅涔堜笂闈㈢殑紼嬪簭婕旂ず浜嗗浣曞仛鍒般?/p>
涓婁緥涓紝getMethod 鐢ㄤ簬鏌ユ壘涓涓叿鏈変袱涓暣鍨嬪弬鏁頒笖鍚嶄負 add 鐨勬柟娉曘傛壘鍒拌鏂規硶騫跺垱寤轟簡鐩稿簲鐨?Method 瀵硅薄涔嬪悗錛屽湪姝g‘鐨勫璞″疄渚嬩腑鎵ц瀹冦傛墽琛岃鏂規硶鐨勬椂鍊欙紝闇瑕佹彁渚涗竴涓弬鏁板垪琛紝榪欏湪涓婁緥涓槸鍒嗗埆鍖呰浜嗘暣鏁?37 鍜?47 鐨勪袱涓?Integer 瀵硅薄銆傛墽琛屾柟娉曠殑榪斿洖鐨勫悓鏍鋒槸涓涓?Integer 瀵硅薄錛屽畠灝佽浜嗚繑鍥炲?84銆?/p>
鍒涘緩鏂扮殑瀵硅薄
瀵逛簬鏋勯犲櫒錛屽垯涓嶈兘鍍忔墽琛屾柟娉曢偅鏍瘋繘琛岋紝鍥犱負鎵ц涓涓瀯閫犲櫒灝辨剰鍛崇潃鍒涘緩浜嗕竴涓柊鐨勫璞?(鍑嗙‘鐨勮錛屽垱寤轟竴涓璞$殑榪囩▼鍖呮嫭鍒嗛厤鍐呭瓨鍜屾瀯閫犲璞?銆傛墍浠ワ紝涓庝笂渚嬫渶鐩鎬技鐨勪緥瀛愬涓嬶細
import java.lang.reflect.*;
public class constructor2 {
public constructor2()
{
}
public constructor2(int a, int b)
{
System.out.println(
"a = " + a + " b = " + b);
}
public static void main(String args[])
{
try {
Class cls = Class.forName("constructor2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct
= cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
鏍規嵁鎸囧畾鐨勫弬鏁扮被鍨嬫壘鍒扮浉搴旂殑鏋勯犲嚱鏁板茍鎵ц瀹冿紝浠ュ垱寤轟竴涓柊鐨勫璞″疄渚嬨備嬌鐢ㄨ繖縐嶆柟娉曞彲浠ュ湪紼嬪簭榪愯鏃跺姩鎬佸湴鍒涘緩瀵硅薄錛岃屼笉鏄湪緙栬瘧鐨勬椂鍊欏垱寤哄璞★紝榪欎竴鐐歸潪甯告湁浠峰箋?/p>
鏀瑰彉瀛楁(鍩?鐨勫?/p>
reflection 鐨勮繕鏈変竴涓敤澶勫氨鏄敼鍙樺璞℃暟鎹瓧孌電殑鍊箋俽eflection 鍙互浠庢鍦ㄨ繍琛岀殑紼嬪簭涓牴鎹悕縐版壘鍒板璞$殑瀛楁騫舵敼鍙樺畠錛屼笅闈㈢殑渚嬪瓙鍙互璇存槑榪欎竴鐐癸細
import java.lang.reflect.*;
public class field2 {
public double d;
public static void main(String args[])
{
try {
Class cls = Class.forName("field2");
Field fld = cls.getField("d");
field2 f2obj = new field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
榪欎釜渚嬪瓙涓紝瀛楁 d 鐨勫艱鍙樹負浜?12.34銆?/p>
浣跨敤鏁扮粍
鏈枃浠嬬粛鐨?reflection 鐨勬渶鍚庝竴縐嶇敤娉曟槸鍒涘緩鐨勬搷浣滄暟緇勩傛暟緇勫湪 Java 璇█涓槸涓縐嶇壒孌婄殑綾葷被鍨嬶紝涓涓暟緇勭殑寮曠敤鍙互璧嬬粰 Object 寮曠敤銆傝瀵熶笅闈㈢殑渚嬪瓙鐪嬬湅鏁扮粍鏄庝箞宸ヤ綔鐨勶細
import java.lang.reflect.*;
public class array1 {
public static void main(String args[])
{
try {
Class cls = Class.forName(
"java.lang.String");
Object arr = Array.newInstance(cls, 10);
Array.set(arr, 5, "this is a test");
String s = (String)Array.get(arr, 5);
System.out.println(s);
}
catch (Throwable e) {
System.err.println(e);
}
}
}
渚嬩腑鍒涘緩浜?10 涓崟浣嶉暱搴︾殑 String 鏁扮粍錛屼負絎?5 涓綅緗殑瀛楃涓茶祴浜嗗鹼紝鏈鍚庡皢榪欎釜瀛楃涓蹭粠鏁扮粍涓彇寰楀茍鎵撳嵃浜嗗嚭鏉ャ?/p>
涓嬮潰榪欐浠g爜鎻愪緵浜嗕竴涓洿澶嶆潅鐨勪緥瀛愶細
import java.lang.reflect.*;
public class array2 {
public static void main(String args[])
{
int dims[] = new int[]{5, 10, 15};
Object arr
= Array.newInstance(Integer.TYPE, dims);
Object arrobj = Array.get(arr, 3);
Class cls =
arrobj.getClass().getComponentType();
System.out.println(cls);
arrobj = Array.get(arrobj, 5);
Array.setInt(arrobj, 10, 37);
int arrcast[][][] = (int[][][])arr;
System.out.println(arrcast[3][5][10]);
}
}
渚嬩腑鍒涘緩浜嗕竴涓?5 x 10 x 15 鐨勬暣鍨嬫暟緇勶紝騫朵負澶勪簬 [3][5][10] 鐨勫厓绱犺祴浜嗗間負 37銆傛敞鎰忥紝澶氱淮鏁扮粍瀹為檯涓婂氨鏄暟緇勭殑鏁扮粍錛屼緥濡傦紝絎竴涓?Array.get 涔嬪悗錛宎rrobj 鏄竴涓?10 x 15 鐨勬暟緇勩傝繘鑰屽彇寰楀叾涓殑涓涓厓绱狅紝鍗抽暱搴︿負 15 鐨勬暟緇勶紝騫朵嬌鐢?Array.setInt 涓哄畠鐨勭 10 涓厓绱犺祴鍊箋?/p>
娉ㄦ剰鍒涘緩鏁扮粍鏃剁殑綾誨瀷鏄姩鎬佺殑錛屽湪緙栬瘧鏃跺茍涓嶇煡閬撳叾綾誨瀷銆?/p>
灝忕粨
Java reflection 闈炲父鏈夌敤錛屽畠浣跨被鍜屾暟鎹粨鏋勮兘鎸夊悕縐板姩鎬佹绱㈢浉鍏充俊鎭紝騫跺厑璁稿湪榪愯鐫鐨勭▼搴忎腑鎿嶄綔榪欎簺淇℃伅銆侸ava 鐨勮繖涓鐗規ч潪甯稿己澶э紝騫朵笖鏄叾瀹冧竴浜涘父璇█錛屽 C銆丆++銆丗ortran 鎴栬?Pascal 絳夐兘涓嶅叿澶囩殑銆?nbsp;