package com.javase.reflect;
import com.javase.service.UserService;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ResourceBundle;
/**
 * 通过反射机制调用方法(必须掌握,五颗星*****)
 *
 *    反射机制让代码具有很强的通用性,可变化的内容都可以写到配置文件中,将来修改配置文件之后,创建的对象
 *    就不一样了,调用的方法也不同了,但是这段java代码不需要改变,这就是反射机制的魅力。
 */
public class ReflectMethodText03五颗星 {
    public static void main(String[] args) {
        //不使用反射机制调用方法
        //创建对象
        UserService userService = new UserService();
        //调用方法
        /**
         * 要素分析
         *     要素1:对象userService
         *     要素2:方法名login
         *     要素3:实际参数
         *     要素4:返回值
         */
        boolean loginSuccess = userService.login("admin","123");
        //使用反射机制来调用一个对象的方法
        //通过资源绑定器来读取配置文件(属性配置文件dp.properties在IDEA中的目录结构如下图)
        ResourceBundle bundle = ResourceBundle.getBundle("dp");
        String className = bundle.getString("className");
        String methodName = bundle.getString("methodName");
        String name = bundle.getString("name");
        String password = bundle.getString("password");
        try {
            //获取类
            Class userServiceClass = Class.forName(className);
            //创建对象(该方法会调用com.javase.service.UserService类中的无参数构造方法,必须保证该类中提供了无参构造)
            Object obj = userServiceClass.newInstance();
            //获取Method(下面方法是通过方法名和形参来获取方法)
            Method loginMethod = userServiceClass.getDeclaredMethod(methodName, String.class, String.class);
            //调用方法
            //使用反射机制调用方法也需要4要素,使用反射机制调用方法是反射机制中最最最重要的方法,必须记住
            /**
             * 使用反射机制调用方法也需要4要素:
             *    要素1:对象obj
             *    要素2:方法loginMethod
             *    要素3:实参"admin","123"
             *    要素4:返回值retValue
             */
            Object retValue = loginMethod.invoke(obj,name,password);
            //打印方法调用后的返回值
            System.out.println(retValue);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
 
package com.javase.service;
/**
 * 用户业务类
 */
public class UserService {
    /**
     * 用户登录方法
     * @param name 用户名
     * @param password 密码
     * @return true表示登录成功  false表示登录失败
     */
    public boolean login(String name,String password){
        if ("admin".equals(name) && "123".equals(password)){
            return true;
        }
        return false;
    }
    /**
     * 退出系统方法
     */
    public void logout(){
        System.out.println("系统已经安全退出!");
    }
} 
                                
属性配置文件dp.properties在IDEA中的目录结构
 
属性配置文件dp.properties



















