通过反射机制获取class中的方法
用户业务类:
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; } // 可能还有一个同名的login方法 // java中怎么区分一个方法,依靠方法名和参数列表。 public void login(int i){ } /** * 退出系统方法 */ public void logout(){ System.out.println("系统已经安全退出!"); } }
如何获取Class文件中的方法:
package com.javaSe.reflect; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /* 作为了解内容(不需要掌握): 反射Method */ public class ReflectTest08 { public static void main(String[] args) throws Exception{ // 获取类 Class userServiceClass = Class.forName("com.javaSe.Service.UserService"); // 获取所有的Method(包括所有私有的!) Method[] methods = userServiceClass.getDeclaredMethods(); System.out.println(methods.length); // 2 // 遍历Method for (Method method : methods){ // 获取修饰符列表 System.out.println(Modifier.toString(method.getModifiers())); // 获取方法的返回值类型 System.out.println(method.getReturnType().getSimpleName()); // 获取方法名 System.out.println(method.getName()); // 方法的修饰符列表(一个方法的参数可能会有多个) Class[] parameterTypes = method.getParameterTypes(); for (Class parameterType : parameterTypes){ System.out.println(parameterType.getSimpleName()); } } } }
反编译一个类中的方法:
package com.javaSe.reflect; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /* 了解一下,不需要掌握(反编译一个类的方法) */ public class ReflectTest09 { public static void main(String[] args) throws Exception{ StringBuilder s = new StringBuilder(); Class userServiceClass = Class.forName("com.javaSe.Service.UserService"); // Class userServiceClass = Class.forName("java.lang.String"); s.append(Modifier.toString(userServiceClass.getModifiers()) + " class " + userServiceClass.getSimpleName() + " {\n"); //修饰符 类名 Method[] methods = userServiceClass.getDeclaredMethods();// 获取整个class中的方法 for(Method method : methods){ s.append("\t"); s.append(Modifier.toString(method.getModifiers()));// 修饰符 s.append(" "); s.append(method.getReturnType().getSimpleName()); // 返回值列表 s.append(" "); s.append(method.getName()); // 方法名 s.append("("); // 参数列表 Class[] parameterTypes = method.getParameterTypes(); for (Class parameterType : parameterTypes){ s.append(parameterType.getSimpleName()); // 参数类型 s.append(","); } // 删除指定下标位置上的字符 s.deleteCharAt(s.length() - 1); s.append("){}\n"); } s.append("}"); System.out.println(s); } }
根据反射机制调用一个类中的方法并获取返回值:
package com.javaSe.reflect; import com.javaSe.Service.UserService; import java.lang.reflect.Method; /* 重点:必须掌握,通过反射机制怎么调用一个对象的方法? 五颗星 ***** 反射机制,让代码很具有通用性,可变化的内容都是写到配置文件当中,将来修改配置文件之后,创建的对象不一样了,调用的方法也不同了, 但是java代码不需要做任何的改动。这就是反射机制的魅力。 */ public class ReflectTest10 { public static void main(String[] args) throws Exception{ // 不使用反射机制,怎么调用方法 // 创建对象 UserService userService = new UserService(); // 调用方法 /* 要素分析: 要素1:对象UserService 要素2:login方法名 要素3:实参列表 要素4:返回值 */ boolean loginSuccess = userService.login("admin","123"); System.out.println(loginSuccess ? "登陆成功" : "登陆失败"); // 使用反射机制来调用一个对象的方法该怎么做? Class userServiceClass = Class.forName("com.javaSe.Service.UserService"); // 创建对象 Object obj = userServiceClass.newInstance(); // 获取Method Method loginMethod = userServiceClass.getDeclaredMethod("login",String.class,String.class); // Method loginMethod = userServiceClass.getDeclaredMethod("login",int.class); // 调用方法 // 调用方法要几个要素?也需要4要素 // 反射机制中最最最最最最最重要的一个方法,必须记住。 // 四要素:loginMethod方法 // obj对象 // "admin","123" 实参 // retValue 返回值 Object retValue = loginMethod.invoke/*调用*/(obj,"admin","123"); System.out.println(retValue); } }