當我們編寫的類生成的位元組碼檔案中的二進位制位元組流被類載入器載入到記憶體當中時,會在方法區產生乙個class物件,作為訪問這些類資訊的入口。
假如我們編寫乙個person類,獲取class物件一般有3種方式:
class有4個獲取字段資訊的方法,包括靜態變數和例項變數:
所有的public欄位,包括其父類的,如果沒有字段,返回空陣列
public
field getfields()
//返回本類宣告的所有字段,包括非public的,但不包括父類的
public
field getdeclaredfields
()//返回本類或父類中指定名稱的public欄位,找不到丟擲異常nosuchfieldexception
public
field getfield
(string
name
)//返回本類中宣告的指定名稱的字段,找不到丟擲異常nosuchfieldexception
public
field getdeclaredfield
(string
name
)當然還可以獲取filed的許可權修飾符,型別及屬性名等資訊。
類中定義的靜態和例項方法都被稱為方法,用類method表示,class有四個獲取方法資訊的方法:
本類和父類所有
public
方法(包括object的
7個方法)
public
method getmethods(
)//只返回本類宣告的所有方法
public
method getdeclaredmethods(
)//返回本類或父類中指定名稱和引數型別的
public
方法,找不到丟擲異常nosuchmethodexception
public
method
getmethod(
string name,
class
<?>... parametertypes)
//返回本類中宣告的指定名稱和引數型別的方法,找不到丟擲異常nosuchmethodexception
public
method
getdeclaredmethod(
string name,
class
<?>... parametertypes)
method有個invoke()方法,可以呼叫物件的方,這個invoke()也是很常用的方法,動態**就用到了方法:
method
method = ***.class.getdeclaredmethod
(xx,xx);
method.invoke
(target,params)
所有的public構造方法,返回值可能為長度為0的空陣列
public
constructor
<?>
getconstructors
()//獲取所有的構造方法,包括非public的
public
constructor
<?>
getdeclaredconstructors
()//獲取指定引數型別的public構造方法,沒找到丟擲異常nosuchmethodexception
public
constructor
<
t>
getconstructor
(class
<?>... parametertypes)
//獲取指定引數型別的構造方法,包括非public的,沒找到丟擲異常nosuchmethodexception
public
constructor
getdeclaredconstructor
(class<?>... parametertypes)
構造器資訊
constructor
constructor = clazz.getconstructor
(string.class, int.class);
//建立執行時的類的物件
constructor.newinstance
("tom", 10);
應用一:使用反射機實現簡單的設值注入過程
/*** created by lance on 2018/3/16.
*/public class injectdemo catch (instantiationexception e) catch (illegalacces***ception e) catch (nosuchmethodexception e) catch (classnotfoundexception e) catch (invocationtargetexception e)
}public static void
main(string args)
}class person
public void
setname(string name)
public integer getage()
public void
setage(integer age)
}
/*** created by lance on 2018/3/16.
* 寫乙個自己的註解
*/@documented
@target()
@retention(retentionpolicy.runtime
)public @inte***ce
wgsannotation
/*** created by lance on 2018/3/16.
* 寫乙個介面,以及兩個不同的實現類,後期注入不同的類
*/@wgsannotation
public class userservice
public void
setuserdao(user userdao)
public void
login()
}
/*** created by lance on 2018/3/16.
* 通過反射
+註解實現注入過程
*/public class beancontainer
}}else
return userservice;
}}
/*** created by lance on 2018/3/16.
* 測試類
*/public class main
}
java反射機制
private string getmethod catch instantiationexception e1 catch illegalacces ception e1 try catch illegalargumentexception e catch illegalacces ception...
Java反射機制
1.反射是指程式在執行時,可以通過反射機制拿到任何乙個類的內部所有資訊。2.可以獲得類的所有屬性資訊,包括私有屬性,並對其進行操作 3.可以獲得物件所對應的類 4.可以拿到本類,或父類中的方法,並且對其進行操作。常用方法 getname 獲得類對應的名稱 getdeclaredfields 獲得類中...
java反射機制
class 獲取class物件有三種方式 例項化物件constructor 獲取方法method 1 批量方法 public method getmethods 獲取所有 公有方法 注 包含了父類的方法也包含object類 public method getdeclaredmethods 獲取所有的...