呼叫執行時類中指定的結構:屬性、方法、構造器
阿新 • • 發佈:2021-09-28
會當凌絕頂,一覽眾山小/** * 呼叫執行時類中指定的結構:屬性、方法、構造器 * * @author shkstart * @create 2019 下午 4:46 */ public class ReflectionTest { /* 不需要掌握 */ @Test public void testField() throws Exception { Class clazz = Person.class; //建立執行時類的物件 Person p = (Person) clazz.newInstance(); //獲取指定的屬性:要求執行時類中屬性宣告為public //通常不採用此方法 Field id = clazz.getField("id"); /* 設定當前屬性的值 set():引數1:指明設定哪個物件的屬性 引數2:將此屬性值設定為多少 */ id.set(p,1001); /* 獲取當前屬性的值 get():引數1:獲取哪個物件的當前屬性值 */ int pId = (int) id.get(p); System.out.println(pId); } /* 如何操作執行時類中的指定的屬性 -- 需要掌握 */ @Test public void testField1() throws Exception { Class clazz = Person.class; //建立執行時類的物件 Person p = (Person) clazz.newInstance(); //1. getDeclaredField(String fieldName):獲取執行時類中指定變數名的屬性 Field name = clazz.getDeclaredField("name"); //2.保證當前屬性是可訪問的 name.setAccessible(true); //3.獲取、設定指定物件的此屬性值 name.set(p,"Tom"); System.out.println(name.get(p)); } /* 如何操作執行時類中的指定的方法 -- 需要掌握 */ @Test public void testMethod() throws Exception { Class clazz = Person.class; //建立執行時類的物件 Person p = (Person) clazz.newInstance(); /* 1.獲取指定的某個方法 getDeclaredMethod():引數1 :指明獲取的方法的名稱 引數2:指明獲取的方法的形參列表 */ Method show = clazz.getDeclaredMethod("show", String.class); //2.保證當前方法是可訪問的 show.setAccessible(true); /* 3. 呼叫方法的invoke():引數1:方法的呼叫者 引數2:給方法形參賦值的實參 invoke()的返回值即為對應類中呼叫的方法的返回值。 */ Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN"); System.out.println(returnValue); System.out.println("*************如何呼叫靜態方法*****************"); // private static void showDesc() Method showDesc = clazz.getDeclaredMethod("showDesc"); showDesc.setAccessible(true); //如果呼叫的執行時類中的方法沒有返回值,則此invoke()返回null // Object returnVal = showDesc.invoke(null); Object returnVal = showDesc.invoke(Person.class); System.out.println(returnVal);//null } /* 如何呼叫執行時類中的指定的構造器 */ @Test public void testConstructor() throws Exception { Class clazz = Person.class; //private Person(String name) /* 1.獲取指定的構造器 getDeclaredConstructor():引數:指明構造器的引數列表 */ Constructor constructor = clazz.getDeclaredConstructor(String.class); //2.保證此構造器是可訪問的 constructor.setAccessible(true); //3.呼叫此構造器建立執行時類的物件 Person per = (Person) constructor.newInstance("Tom"); System.out.println(per); } }