反射很大的一个优点就是灵活性高,能够动态(运行时)加载资源,这里分享一下如何使用反射加载类以及调用方法
二话不说,直接上代码,目的是使用反射创建ReflexDemo类对象以及调用它的方法。
目录结构如下(普通Java项目)
ReflexDemo.java
package priv.cwr.demo;
import java.util.Map;
import java.util.UUID;
/**
* 反射Demo类
*/
public class ReflexDemo {
public void print(String str) {
System.out.println(str);
}
public Map<String, Object> addMap(Map<String, Object> map) {
map.put("token", UUID.randomUUID().toString());
return map;
}
}
Main.java
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
try {
// 创建Class类
Class<?> mClass = Class.forName("priv.cwr.demo.ReflexDemo");
// 创建对象(在使用反射创建对象的时候,可能并不知道是一个怎么样的对象,所以这里用Object接收)
// 反射调用方法时需要使用
Object object = mClass.newInstance();
// 调用void print(String)方法
Method printMethod = mClass.getMethod("print", String.class);
printMethod.invoke(object, "Hello World");
// Map<String, Object> addMap(Map<String, Object>)方法
Method addMapMethod = mClass.getMethod("addMap", Map.class);
// 需要的参数
Map<String, Object> map = new HashMap<>(16);
map.put("name", "Tom");
map = (Map<String, Object>) addMapMethod.invoke(object, map);
System.out.println("after addMap() -> " + map);
} catch (InstantiationException
| IllegalAccessException
| ClassNotFoundException
| NoSuchMethodException
| InvocationTargetException e) {
e.printStackTrace();
}
}
}
运行结果如下: