小狼最近看的hibernate啊,struts啊,spring啊,都是用反射的机制写的,所以呢,小狼决定今天也来看看反射,究竟是个什么样的东西
有这样一道题
编写一个程序,可以接受一个类的全路径,创建这个类的实例,获取类中的所有属性,并且执行全部以test开头的无参数方法
毫无疑问,这就是一道反射
小狼现在就想模拟${user.username}这样一个EL表达式
首先要读出数据,就必须写入数据
private void setterMethod(Object obj, String name, Object[] args) {
try {
String methodName = "set" + name.substring(0, 1).toUpperCase()
+ name.substring(1);
Method[] methods = clazz.getMethods();
for (Method method : methods) {
String methodNameGet = method.getName();
if (methodName.equals(methodNameGet)) {
Class<?>[] claxxes = method.getParameterTypes();
String claxxName = null;
for (Class claxx : claxxes) {
claxxName = claxx.getName();
StaticUtil.lists.add(claxxName);
}
for (int i = 0; i < StaticUtil.lists.size(); i++) {
Object list=StaticUtil.lists.get(i);
for (Object arg : args) {
String argName = arg.getClass().getName();
if(list.equals(argName)){
method.invoke(obj, args);
}else{
System.out.println("请用下列类型:"+list);
break;
}
}
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
Log.getLog().info("运行失败");
e.printStackTrace();
}
}
大家都是set方法的格式一般都是setUsername();这样的,所以我们先得到set方法名称并用之与该类的所有方法名对比,获得该方法的参数,校验参数类型,
传入值,set方法就ok了
接下来get方法,小狼就不多说了
private Object getterMethod(Object obj,String name){
Class clazz=obj.getClass();
Object returnValue=null;
String getMethodName="get"+name.substring(0,1).toUpperCase()+name.substring(1);//setUserName
Method[] methods=clazz.getDeclaredMethods();
for(Method method : methods)
{
if(getMethodName.equals(method.getName()))
{
try {
returnValue=method.invoke(obj, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return returnValue;
}
还有,对于反射调用private修饰的方法,必须写上method.setaccessible(true);
怎么样,反射是不是很强大很强大。。。快来给小狼点赞吧