之前想过一个问题,能否通过字符串调用某个类中的方法。百度了很久,通过反射机制就实现了我想要的功能。
先来看看解决我问题的方法:
// 通过包名.类名得到Class对象
String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
// 通过demo对象获取实例
HashMap<String, String> hashMap = (HashMap<String, String>) demo.newInstance();
// 调用自带的put函数
hashMap.put("a", "1");
System.out.println("=========put函数调用后=========");
System.out.println(hashMap);
// 通过反射机制,得到remove方法
Method method = demo.getDeclaredMethod("remove", Class.forName("java.lang.Object"));
// 调用remove方法
method.invoke(hashMap, "a");
System.out.println("=========通过反射remove函数调用后=========");
System.out.println(hashMap);
程序运行结果:
=========put函数调用后=========
{a=1}
=========通过反射remove函数调用后=========
{}
我们了解下Java的反射机制能做什么。
得到方法名
String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
Method[] methods = demo.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
程序运行结果:
public java.lang.Object java.util.HashMap.remove(java.lang.Object)
public boolean java.util.HashMap.remove(java.lang.Object,java.lang.Object)
public java.lang.Object java.util.HashMap.get(java.lang.Object)
......
得到属性
String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
Field[] fields = demo.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
程序运行结果:
private static final long java.util.HashMap.serialVersionUID
static final int java.util.HashMap.DEFAULT_INITIAL_CAPACITY
static final int java.util.HashMap.MAXIMUM_CAPACITY
......
得到父类
String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
System.out.println(demo.getSuperclass());
程序运行结果:
class java.util.AbstractMap
调用类构造函数
String info = "java.util.HashMap";
Class<?> demo = Class.forName(info);
// 通过demo对象获取实例
HashMap<String, String> hashMap = (HashMap<String, String>) demo.newInstance();
newInstance()就是调用了构造函数,而且还是调用了无参构造函数,如果需要携带参数,直接在后面加上即可。
现在想想,很多J2EE框架,依赖于xml,可能就是使用了反射机制。