1. 程式人生 > 實用技巧 >Java 反射機制 之 呼叫方法

Java 反射機制 之 呼叫方法

Java 反射機制 之 呼叫方法

一、newInstance()

注意:newInstance() 底層呼叫的事該類的無參構造方法,所以沒有無參構造方法就會出現例項化異常!

	public static void main(String[] args) throws Exception {
        // 一般方法
        UserService userService = new UserService();
        System.out.println("直接建立物件: "+userService.login("root", "123456"));// true

        // 通過反射機制呼叫方法 四步驟

        // 1、獲取類
        Class<?> aClass = Class.forName("com.hjx.反射.反射呼叫方法.UserService");
        // 2、通過呼叫無參構造方法  建立物件
        // newInstance()只能呼叫無參,不然會報例項化異常 InstantiationException
        Object o = aClass.newInstance();
        // 3、獲取方法  因為方法有可能過載,所以要指定引數型別和個數,位置
        Method method = aClass.getDeclaredMethod("login",String.class,String.class);
        // 如果獲取的方法是私有,則需要取消檢查。不然會報非法訪問異常 IllegalAccessException
//        method.setAccessible(true);
        // 4、呼叫方法
        Object o1 = method.invoke(o, "root", "123456");
        System.out.println("通過反射機制呼叫方法: " +o1);// true


    }

二、Constructor

獲取指定的 Constructor 物件,再用 Constructor 物件呼叫 newInstance() 例項化。
這個方法可以指定構造方法,即可用有參構造來例項化

程式碼參考:

    public static void main(String[] args) throws Exception {
        // 有參構造建立物件
        // 1、獲取類
        Class<?> aClass = Class.forName("com.hjx.反射.Person");
        // 2、獲取指定有參的構造方法
        Constructor<?> constructor = aClass.getDeclaredConstructor(
                String.class, int.class, String.class, String.class);
        // 3、通過上面 構造方法 建立物件
        Object o = constructor.newInstance("張勝男", 18, "bejign", "wu");
        System.out.println(o);



        // 無參構造建立物件
        Object o1 = aClass.newInstance();
        System.out.println(o1);
    }

輸出結果:

Person{name='張勝男', age=18, address='bejign', remark='wu'}
Person{name='null', age=0, address='null', remark='null'}