struts2中RequestAware通过反射简单原理实现
2017-04-27 01:53
239 查看
我们知道,在struts2中,只要实现RequestAware,SessionAware,ApplicationAware等接口就可以使用这些对象了,达到和原本对象一样的效果,这里简单实现下,不一定完全按照我的套路
大概可以分为三个步骤:
1,获取对象,判断是否实现了此接口.如果是,传一个初始化的map给他.
2.调用主业务方法
3.从request中取出key和value,然后放入真正的request对象中
是不是很简单呢
下面给出实现:
大概可以分为三个步骤:
1,获取对象,判断是否实现了此接口.如果是,传一个初始化的map给他.
2.调用主业务方法
3.从request中取出key和value,然后放入真正的request对象中
是不是很简单呢
下面给出实现:
package testRequestAware;/*4/27/2017*/ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; //模拟接口 interface RequestAware{ void setRequest(Map<String,Object> request); } //模拟jsp中内置对象request class Request{ Map<String,Object> request=new HashMap<>(); public Map<String, Object> getRequest() { return request; } public void setAttribute(String key,Object value){ request.put(key,value); } public Object getAttribute(String key){ return request.get(key); } } public class Test implements RequestAware { private Map<String,Object> request; @Override public void setRequest(Map<String, Object> request) { this.request=request; } public String execute(){ request.put("name","wyh"); return "success"; } @SuppressWarnings("unchecked") public static void main(String[] args)throws Exception{ //一,先通过配置文件读到这个action,省略解析xml String actionStr="testRequestAware.Test"; //后面工作相当于通过拦截器进行 //获取class对象 Class actionCls=Class.forName(actionStr); //获取实例 Object actionInstance=actionCls.newInstance(); //判断是否实现了接口,此步骤仅仅传一个HashMap if(actionInstance instanceof RequestAware){ Method setRequest=actionCls.getDeclaredMethod("setRequest", Map.class); //调用,传入一个空的hashMap即可 setRequest.invoke(actionInstance,new HashMap<String,Object>()); } //二,然后调用这个类的业务方法execute,注意,要先调用,保证用户使用完request后,再从里面取值.同样通过xml解析,那么真实数据就被put到request map中了 String methodName="execute"; Method mainMethod=actionCls.getDeclaredMethod(methodName); mainMethod.invoke(actionInstance); //三,把内容取出来,放到真正的request中,这里用自建的一个request模拟 //先获取成员变量,这里注意,不一定是这么实现的,因为这个成员名他没限制你,这里只是假想下 Field requestField=actionCls.getDeclaredField("request"); //设置访问私有变量权限,因为是同一个类下,不设置可以访问,但是在其他类中就不行了 requestField.setAccessible(true); //这里注意,需要传入这个类的对象才可以获取他字段的对象 Map<String,Object> fieldValue=(Map<String,Object>)requestField.get(actionInstance); //实例化假想的request Request request=new Request(); //把用户自己的map放到这个request中 for(Object key:fieldValue.keySet()){ request.setAttribute((String)key,fieldValue.get(key)); } //四,那么,你的数据就被放入"request"中,就可以在前台调用了.最后输出结果验证 System.out.println(request.getAttribute("name")); //五,输出"wyh" } }
相关文章推荐
- 一个自动更新的简单实现(通过反射解耦)
- Java通过反射实现简单对象的拷贝
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 通过JAVA反射实现简单的ORM,将查询结果封装为对象
- SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- SqlHelper简单实现(通过Expression和反射)10.使用方式
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- C#通过反射获得类的实例简单实现
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
- Java 反射学习(四)反射技术开发框架原理简单实现
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- vb.net 中通过反射实现简单工厂模式
- Struts2 框架的简单实现——轻松理解Struts原理
- 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象
- 番外 01:Spring IoC 实现原理简析,Java的反射机制,通过类名创建对象