Java中 根据字符串——获取未知类里未知方法的执行结果

需求:

现在有一个User类,User类里有个getUserName()的方法,由于某些条件限制,我们不能直接用User.getUserName()来获取这个方法执行的结果;

已知:对象名,即User这个字符串;方法名,即getUserName这个字符串

所以就是标题要表达的意思了

先来个User类的定义

package com.test;

public class User {
    private String userId;
    private String userName;
    
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return "Tom";
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
}

实现思路:就是利用Java的反射机制,加载实例化类,之后调用方法,执行方法

package com.test;

import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println(Test.getWhatMethodFromWhatClass("com.test.User", "getUserName"));
    }
    
    /***
     * 获取指定类的指定方法的执行结果
     * @param className  全路径 带包名的类名
     * @param methodName 方法名
     * @return
     * @throws Exception
     */
    public static String getWhatMethodFromWhatClass(String className,String methodName) throws Exception{
        //返回指定包下指定类
        Class loadClass = Class.forName(className);
        Object thisClass = null;
        //实例化上一步返回的类
        thisClass = loadClass.newInstance();
        //取出类里所有的方法名
        Method[] mths = loadClass.getDeclaredMethods();
        //校验 目标类是否有对应的方法
        boolean flag = false;
        for (int i = 0; i < mths.length; i++) {
             if(mths[i].getName().equals(methodName)){
                 flag = true;
                 break;
             }
        }
        if(!flag){
            return "你想干啥???";
        }
        //取出对应的方法的执行结果
        Method mm = loadClass.getDeclaredMethod(methodName);
        return (String) mm.invoke(thisClass);
    }
}

执行结果

Tom

你可能感兴趣的:(Java中 根据字符串——获取未知类里未知方法的执行结果)