通过反射机制获取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() + " {
");
                //修饰符                                                           类名
        Method[] methods = userServiceClass.getDeclaredMethods();// 获取整个class中的方法
        for(Method method : methods){
            s.append("	");
            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("){}
");
        }
        
        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);
        
    }
}
原文地址:https://www.cnblogs.com/xlwu/p/13612770.html