力所能及之Java反射机制(模拟EL表达式)

来源:互联网 发布:java公司官网模板源码 编辑:程序博客网 时间:2024/04/29 02:52

小狼最近看的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 blockLog.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);//setUserNameMethod[] 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 blocke.printStackTrace();}}}return returnValue;}

还有,对于反射调用private修饰的方法,必须写上method.setaccessible(true);

怎么样,反射是不是很强大很强大。。。快来给小狼点赞吧


0 0
原创粉丝点击