java中的反射機制
- 定義
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠獲取這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。
JAVA反射(放射)機制:“程序運行時,允許改變程序結構或變量類型,這種語言稱爲動態語言”。
- 功能
1.在運行時判斷任意一個對象所屬的類
2.在運行時構造任意一個類的對象
3.在運行時判斷任意一個類所具有的成員變量和方法
4.在運行是獲取泛型信息
5.在運行時調運任意一個對象的成員變量和方法
6.在運行時處理註解
7.生成動態代理
java反射字節碼對象方式:
方法 |
示例 |
對象名.getClass() |
stu.getClass();(前提條件是必須對象存在) |
類名.class |
Student.class |
Class.forName(“包名.類名”) |
Class.forName(“util.Student”) |
Class 類的方法
方法 |
功能 |
newInstance() |
創建此類的對象(實例化的類一定有無參數的構造函數,否則不能被實例化) |
getField(String name) |
返回此類的或者接口指定name的公共屬性(返回值爲Field類型) |
getFields() |
返回此類的或者接口所有的公共屬性(返回值爲Field類型的數組) |
getMethod(String name, 類<?>… parameterTypes) |
返回此類的或者接口指定name,指定參數的公共方法(返回值爲Method類型) |
getMethods() |
返回此類的或者接口所有的公共方法(返回值爲Method類型的數組) |
getDeclaredField(String name) |
返回此類的或者接口指定name的所有屬性(返回值爲Field類型) |
getDeclaredFields() |
返回此類的或者接口所有的屬性(返回值爲Field類型的數組) |
getDeclaredMethod(String name, 類<?>… parameterTypes) |
返回此類的或者接口指定name,指定參數的所有方法,parameterTypes參數的寫法爲:參數類型.class(返回值爲Method類型) |
getDeclaredMethods() |
返回此類的或者接口所有的方法(返回值爲Method類型的數組) |
Filed類的方法
方法 |
功能 |
equals(Object obj) |
將此 Field與指定對象進行比較 |
get(Object obj) |
返回該表示的屬性的值(返回值爲Object,參數obj爲指定的該對象) |
setAccessible(boolean boo) |
此方法爲父類AccessibleObject的方法,賦予操作對象私有屬性的權限,參數true爲是,false爲否 |
set(Object obj, Object value) |
obj爲指定的該對象,方法的作用是設置該表示屬性的值爲value |
Method類中的方法
方法 |
功能 |
equals(Object obj) |
將此 方法與指定對象進行比較 |
getName() |
返回該方法的名字(返回值爲String) |
invoke(Object obj, Object… args) |
執行此方法,obj爲指定該對象,args爲需要的參數, |
舉例
Student類
public class Student {
private String name;
private int num;
public Student(){
}
public Student(String name, int num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
public void play(int a){
System.out.println("輸出參數爲"+a+"的方法");
}
}
Class,Filed,Method某些方法的測試
public class text {
public static void main(String[] args) {
try {
//根據反射創建Class對象
Class cls = Student.class;
//創建類Student的對象stu
Student stu = (Student) cls.newInstance();
//獲取指定名字的私有屬性
Field field = cls.getDeclaredField("name");
Field field1 = cls.getDeclaredField("num");
//設置操作私有屬性的權利
field.setAccessible(true);
field1.setAccessible(true);
//設置私有屬性的值
field.set(stu,"張三");
field1.set(stu,1);
//獲取指定名字的方法,及形參的寫法
Method method = cls.getDeclaredMethod("toString",null);
Method method1 = cls.getDeclaredMethod("play", int.class);
//執行方法,參數爲執行方法的對象
System.out.println(method.invoke(stu));
//執行方法,參數爲執行方法的對象,及該方法需要的參數
method1.invoke(stu,666);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注:類中的方法只寫了一些部分方法,日後有需要,即使補充。