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