@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);