业务场景:不具体方法调用,根据方法名和方法入参来调用对应的方法
1. 被调用对象
import com.alibaba.fastjson.JSON;
public class Demo {
// 测试传入不同类型参数
public static String test1(String name,Integer age){
System.out.println("入參打印:name:"+name+",age:"+age);
return "test1执行成功!";
}
// 测试传入对象
public static String test2(User user){
System.out.println("入參打印:user:"+ JSON.toJSONString(user));
return "test2执行成功!";
}
}
对象参数:
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.反射工具类
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;
public class ReflectionUtils {
public static void main(String args[]){
JSONObject reParams = new JSONObject();
reParams.put("name","张三");
reParams.put("age","23");
System.out.println("==============测试test1调用==============");
invokeMethod("test1",reParams);
System.out.println("==============测试test2调用==============");
invokeMethod("test2",reParams);
}
public static Object invokeMethod(String methodName,JSONObject reqParams){
Class<?> clazz;
ReflectionUtils utils = new ReflectionUtils();
ObjectMapper objectMapper = new ObjectMapper();
try {
clazz = Class.forName("com.example.demo.util.Demo");
Method[] methods = clazz.getDeclaredMethods();
for(Method method:methods){
if(methodName.equals(method.getName())){
Parameter[] parameters = method.getParameters();
List<Object> paramsValue = new ArrayList<>();
for(Parameter parameter:parameters){
System.out.println("参数类型:"+parameter.getType().getName());
if(parameter.getType().getName()!=null&¶meter.getType().getName().contains("com.example.demo.util.User")){
Class<?> beanClazz = Class.forName(parameter.getType().getName());
Object obj = beanClazz.newInstance();
Field[] fields = beanClazz.getDeclaredFields();
for(Field field:fields){
Class<?> type = field.getType();
String fieldName = field.getName();
// 类型转换
Object value = objectMapper.convertValue(reqParams.get(fieldName), type);
if(value != null){
String methodNm = "set"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
Method methodField = obj.getClass().getMethod(methodNm,type);
methodField.invoke(obj,value);
}
}
System.out.println("对象参数:"+ JSON.toJSONString(obj));
paramsValue.add(obj);
}else{
Class<?> type = parameter.getType();
String name = parameter.getName();
Object value = objectMapper.convertValue(reqParams.get(name), type);
paramsValue.add(value);
}
}
Object[] array = paramsValue.toArray();
Object invoke = method.invoke(utils, array);
System.out.println("反射调用结果:"+ JSON.toJSONString(invoke));
return invoke;
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
}
3.pom 添加依赖和插件
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
通过com.fastxml.jackson的ObjectMapper对象进行转换,用于转换参数类型
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
反射获取真实参数名,参考:https://blog.youkuaiyun.com/lvhu123/article/details/98873473
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
4.打印结果