Java:反射机制浅析

之前想过一个问题,能否通过字符串调用某个类中的方法。百度了很久,通过反射机制就实现了我想要的功能。

先来看看解决我问题的方法:

// 通过包名.类名得到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,可能就是使用了反射机制。

猜你喜欢

转载自blog.csdn.net/new_Aiden/article/details/51756854