類是用來描述物件的。反射機制是用來描述所有的類的,所有的類也具有相同的特徵,都有屬性、方法、構造方法等。
class用來描述類本身
field描述類的屬性
method描述類的方法
constructor描述類中的構造方法
annotation用來描述類中的註解
package用來描述類所屬的包
如何獲取class
class clazz
= class.
forname
("類全路徑");
class clazz
= person.
class
;class clazz
= person.
getclass()
;
常用方法
//類的常用操作
class clazz
= class.
forname
("com.chwang.person");
int modifiers = clazz.
getmodifiers()
;//獲取許可權、特徵修飾符
string name = clazz.
getname()
;//獲取名字
string ******name = clazz.
get******name()
;package pa = clazz.
getpackage()
;//獲取包
class sclazz
= clazz.
getsuperclass()
;//獲取超類
//屬性的操作
object obj = clazz.
newinstance()
;//相當於呼叫無參構造方法,如果無引數構造方法不存在,則報錯
field field = clazz.
getfield
("name");
//獲取屬性,如果屬性是private則獲取不到!!!
field.
set(obj,
"xiaoming");
//給屬性複製
string objname =
(string) field.
get(obj)
;//取出屬性值
field[
] fields = clazz.
getfields()
;//繼承的屬性也能獲取!!!
field declaredfield = clazz.
getdeclaredfield
("name");
//可以獲取私有屬性,只能獲取本類的屬性
declaredfield.
setaccessible
(true);
//可以操作私有屬性
//方法的操作
method method = clazz.
getmethod
("eat"
,string.
class);
//獲取公有方法,可以獲取超類的方法
string str =
(string) method.
invoke
(obj,
"test");
//呼叫方法
method[
] methods = clazz.
getmethods()
;//獲取所有公有方法
method m = clazz.
getdeclaredmethod
("run");
//獲取私有方法
class rclazz
= m.
getreturntype()
;//獲取返回型別
m.setaccessible
(true);
m.invoke
(obj)
;//構造方法操作
constructor con = clazz.
getconstructor
(string.
class);
//適用於有參的構造方法
person p1 =
(person)con.
newinstance
("test");
person p2 =
(person) clazz.
newinstance()
;//用於無引數構造方法
用反射來修改string物件
我們知道string的底層儲存結構是乙個chr陣列,value屬性被private修飾是私有的,final修飾表示value指向的位址不可改變,就導致了string的長度和內容都不可以改變。
public final class
string
那我們可否利用反射來修改string的內容呢?
string str =
"abc"
;class clazz
= str.
getclass()
;field field = clazz.
getdeclaredfield
("value");
field.
setaccessible
(true);
char[
] r =
(char[
]) field.
get(str)
;system.out.
println
(r);
//abc
for(int i =
0; i < r.length; i++
)system.out.
println
(str)
;//bcd
設計乙個方法,給乙個描述類文字字串,返回乙個該類的物件
比如考試系統的question類和user類兩個類的目的不是為了邏輯功能,只是為了儲存值,看似是個物件,更像是個容器。
設計乙個小工具,替代建立物件的過程,傳遞乙個字串幫我們建立乙個物件。有點類似於spring反射建立物件的思想。
public
class
myspring
}catch
(exception e)
return obj;
}}
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物件,作為訪問這些類資訊的入口。假如我們編寫乙個person類,獲取class物件一般有3種方式 class有4個獲取字段資訊的方法,包括靜態變數和例項變數 所有的public欄位,包括其父...