需求:
现在有一个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);
}
}