Java反射机制能让程序在运行时加载和使用编译期间完全未知的类。当你不能在编译时获知目标类的类型,只能根据命名规则去进行集成时,就要用到反射机制,一般做底层开发时用到,例如spring的IOC就通过反射机制实现、xml配置文件里的class等,反射机制还可以绕过private保护机制(Hibernate)
package demo;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Reflection {
private String pri_msg;
public Reflection(){
this.pri_msg = null;
}
private void print(){ //私有方法,可通过反射机制访问
System.out.println(pri_msg);
}
public String getPri_msg() {
return pri_msg;
}
public void setPri_msg(String pri_msg) {
this.pri_msg = pri_msg;
}
public static void main(String[] args) throws Exception {
String className = "demo.Reflection"; //类名,注意加上包名
String methodName1 = "setPri_msg";
String methodName2 = "getPri_msg";
String methodName3 = "print";
String parameter1 = "message";
List parameters =new ArrayList();
parameters.add(parameter1);
Class classType = Class.forName(className); //根据类名得到类型对象
Object obj = classType.newInstance(); //实例化类型对象
doMethod(obj,methodName1,parameters);
parameters.clear();
doMethod(obj,methodName2,parameters);
doMethod(obj,methodName3,parameters);
}
/**
根据对象,方法名,参数列表执行方法
*/
public static void doMethod(Object obj,String methodName,List parameters) throws Exception{
Class parameterType[] = new Class[parameters.size()];
Object[] param = new Object[parameters.size()];
for(int i=0;i<parameters.size();i++){ //通过参数列表得到参数类型数组和参数数组
parameterType[i] = parameters.get(i).getClass();
param[i] = parameters.get(i);
}
//根据方法名及方法的参数类型数组得到方法(public、private、protected),getMethod()只得到public方法
Method method = obj.getClass().getDeclaredMethod(methodName, parameterType);
method.setAccessible(true); //取消权限检查
method.invoke(obj, param); //执行方法,第一个参数是将要执行方法的对象,第二参数是方法的参数数组
}
}