@Override
public String toString() {
return \"Student{\" +
\"id\u003d\" + id +
\", name\u003d\u0027\" + name + \u0027\\\u0027\u0027 +
\u0027}\u0027;
}
}
package com.atguigu.reflect;
import java.lang.reflect.Field;
public class TestField {
public static void main(String[] args)throws Exception {
//1、獲取 Student 的 Class 對象
Class clazz \u003d Class.forName(\"com.atguigu.reflect.Student\");
//2、獲取屬性對象,例如:id 屬性
Field idField \u003d clazz.getDeclaredField(\"id\");
//3、如果 id 是私有的等在當前類中不可訪問 access 的,我們需要做如下
操作
idField.setAccessible(true);
//4、創建實例對象,即,創建 Student 對象
Object stu \u003d clazz.newInstance();
//5、獲取屬性值
/*
* 以前:int 變量\u003d 學生對象.getId()
* 現在:Object id 屬性對象.get(學生對象)
*/
Object value \u003d idField.get(stu);
System.out.println(\"id \u003d \"+ value);
//6、設置屬性值
/*
* 以前:學生對象.setId(值)
* 現在:id 屬性對象.set(學生對象,值)
*/
idField.set(stu, 2);
value \u003d idField.get(stu);
System.out.println(\"id \u003d \"+ value);
}
}
關於 setAccessible 方法的使用:
• Method 和 Field、Constructor 對象都有 setAccessible()方法。
• setAccessible 啟動和禁用訪問安全檢查的開關。
• 參數值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。
– 提高反射的效率。如果代碼中必須用反射,而該句代碼需要頻繁的被調
用,那麼請設置為 true。
– 使得原本無法訪問的私有成員也可以訪問
• 參數值為 false 則指示反射的對象應該實施 Java 語言訪問檢查。
4.3.2 調用指定的方法
(1)獲取該類型的 Class 對象
Class clazz \u003d Class.forName(\"包.類名\");
(2)獲取方法對象
Method method \u003d clazz.getDeclaredMethod(\"方法名\",方法的形參類型列表);
(3)創建實例對象
Object obj \u003d clazz.newInstance();
(4)調用方法
Object result \u003d method.invoke(obj, 方法的實參值列表);
如果方法的權限修飾符修飾的範圍不可見,也可以調用
setAccessible(true)
如果方法是靜態方法,實例對象也可以省略,用 null 代替
示例代碼:
package com.atguigu.reflect;
import org.junit.Test;
import java.lang.reflect.Method;
public class TestMethod {
@Test
public void test()throws Exception {
// 1、獲取 Student 的 Class 對象
Class<?> clazz \u003d Class.forName(\"com.atguigu.reflect.Student
\");
//2、獲取方法對象
/*
* 在一個類中,唯一定位到一個方法,需要:(1)方法名(2)形參列表,
因為方法可能重載
*
* 例如:void setName(String name)
*/
Method setNameMethod \u003d clazz.getDeclaredMethod(\"setName\", Str
ing.class);
//3、創建實例對象
Object stu \u003d clazz.newInstance();
//4、調用方法
/*
* 以前:學生對象.setName(值)
* 現在:方法對象.invoke(學生對象,值)
*/
Object setNameMethodReturnValue \u003d setNameMethod.invoke(stu, \"
張三\");
System.out.println(\"stu \u003d \" + stu);
//setName 方法返回值類型 void,沒有返回值,所以 setNameMethodRetu
rnValue 為 null
System.out.println(\"setNameMethodReturnValue \u003d \" + setNameMet
hodReturnValue);