1. 程式人生 > 其它 >呼叫執行時類中指定的結構:屬性、方法、構造器

呼叫執行時類中指定的結構:屬性、方法、構造器

/**
 * 呼叫執行時類中指定的結構:屬性、方法、構造器
 *
 * @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);

    }

}
會當凌絕頂,一覽眾山小