资讯专栏INFORMATION COLUMN

Java笔记-反射机制(三)-小demo

zhangwang / 3388人阅读

摘要:经过前面几次反射机制的学习,这次用反射的知识写一个类似于框架处理机制的小。和在引入反射知识前,先简单介绍下框架和。再次使用反射获取的最新值,组成返回,同时根据方法的返回值,去中获取对应的。最后根据的返回值和的名称组成最终展示的视图。

经过前面几次反射机制的学习,这次用反射的知识写一个类似于Struts框架处理机制的小demo。

Servlet 和 Sturts

在引入反射知识前,先简单介绍下Sturts框架和Servlet。
在没有一些Web框架之前,当我们要写Java Web应用使用的就是Servlet。一个简单的Servletdemo就是如下所示。

public class HelloWorld extends HttpServlet {
 
   private String message;

   public void init() throws ServletException {
      message = "Hello World";
   }

   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("

" + message + "

"); } public void destroy() { } }

servlet会提供出来doGet和doPost,同时接收用户传入的参数,进行业务处理,再返回视图。那么Servlet如何与URL对应起来呢,答案就是在web.xml,绑定servlet和url之间的映射关系。


   HelloWorld
   HelloWorld



   HelloWorld
   /HelloWorld

映射、业务逻辑处理、视图返回全部在servlet中完成,耦合度比较高,随着url的增多,servlet会越来越多,需要在web.xml配置很多映射关系,不利于维护。同时servlet的入参以及返回的参数很依赖于当前运行的容器,本身也是线程不安全的,当入参非常多时,需要多次调用getParm方法,代码很冗余。
之后Struts框架诞生,通过统一的ActionServlet处理具体的url请求和参数映射以及根据不同的返回结果跳转不同的视图,开发者只需要关心自己的业务逻辑,就可以实现web应用的开发。具体的Struts的配置文件,大致如下面XML所示。



    
        /jsp/homepage.jsp
        /jsp/showLogin.jsp
    
    
        /jsp/welcome.jsp
        /jsp/error.jsp
    

我们只需要分别实现视图和业务逻辑,再通过struts将他们绑定起来,就可以完成开发工作,也更便于理解,方便维护。有兴趣的读者可以自行深入学习下servlet和struts的思想。

小demo

我想写的小demo就是利用读取xml,利用反射加载不同的action,进行业务逻辑处理,最后输出返回的视图,整个逻辑思路还是比较简单,纯当反射学习的练手。
首先是定义配置类,把xml中action对应的映射关系保存下来

private class ActionConfig {
        private String name;
        private String className;
        private Map viewResult = new HashMap<>();

当初始化读取xml完毕后,得到如下结构,action的名字对应着具体的action配置

Map actionConfigMap = new HashMap<>();

模拟Struts ActionServlet的运作方式

public View runAction(String actionName, Map params) {
        String className = cfg.getClassName(actionName);
        if (className == null) {
            return null;
        }
        try {
            Class clz = Class.forName(className);
            Object action = clz.newInstance();
            ReflectionUtil.invokeSetMethods(action, params);
            String resultName = (String) clz.getDeclaredMethod("execute").invoke(action);
            Map result = ReflectionUtil.invokeGetMethods(action);
            String resultView = cfg.getViewResult(actionName, resultName);
            return new View(resultView, result);

通过actionName从配置类中拿到具体的执行类的全类名,其实Struts框架就是直接解析url,然后对应到xml配置的对应action名称,将url和具体的执行类绑定在一起。
之后是使用Class.forName创建类类型,然后创建对应的实例。ReflectionUtil里面做的事情就是,先获取action中对应的field的Name,然后从变量中,根据filed名称找对应的值,然后使用set方法对action的field进行赋值操作,就是LoginAction中的相关信息。

public class LoginAction {
    private String name;
    private String password;
    private String message;

这一步就省去了使用servlet时,重复去get赋值的繁琐操作,利用反射机制,直接对成员变量进行赋值,开发者只需要将前端会传入的参数名称和后端类中的名称做好事先的确认即可。
然后就是通过反射调用execute方法,使用了Method.invoke方法。再次使用反射获取field的最新值,组成map返回,同时根据方法的返回值,去actionConfigMap中获取对应的view。
最后根据field的返回值map和view的名称组成最终展示的视图。

结尾

以上其实就是根据反射知识模仿的struts核心运行流程的小demo,整个web框架处理了非常多的其他的事情比如参数映射,安全,Json处理等,如果有兴趣,可以进一步做学习。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70760.html

相关文章

  • (CZ深入浅出Java基础)反射

    摘要:分类根类加载器也被称为引导类加载器,负责核心类的加载比如等。要想解剖一个类必须先要获取到该类的字节码文件对象。 这是刘意老师的JAVA基础教程的笔记讲的贼好,附上传送门 传智风清扬-超全面的Java基础 一、类的加载 1.类初始化的时机 创建类的实例访问类的静态变量,或者为静态变量赋值调用类的静态方法使用反射方式来强制创建某个类或接口对应的java.lang.Class对象初始化某个类...

    asoren 评论0 收藏0
  • Java笔记-反射机制(一)

    摘要:反射机制一结合官方通过编写的反射教程,复习一下反射的知识。反射的概念反射是一种在运行时获取以及修改应用行为的一种工具。因为反射需要动态的解析类的信息,相比于非反射使用的方式要慢。反射需要获取一定的运行时权限,在特定的安全环境下不一定存在。 Java反射机制(一) 结合Oracle官方通过JDK8编写的反射教程,复习一下反射的知识。结尾篇补一个小例子。 主要内容 这次博客的主要内容就是简...

    AWang 评论0 收藏0
  • 四年来Android面试大纲,作为一个Android程序员

    摘要:再附一部分架构面试视频讲解本文已被开源项目学习笔记总结移动架构视频大厂面试真题项目实战源码收录 Java反射(一)Java反射(二)Java反射(三)Java注解Java IO(一)Java IO(二)RandomAccessFileJava NIOJava异常详解Java抽象类和接口的区别Java深拷贝和浅拷...

    不知名网友 评论0 收藏0
  • Java相关

    摘要:本文是作者自己对中线程的状态线程间协作相关使用的理解与总结,不对之处,望指出,共勉。当中的的数目而不是已占用的位置数大于集合番一文通版集合番一文通版垃圾回收机制讲得很透彻,深入浅出。 一小时搞明白自定义注解 Annotation(注解)就是 Java 提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。Annotion(注解) 是一个接口,程序可以通过...

    wangtdgoodluck 评论0 收藏0
  • Thinking in Java学习笔记——Type Information

    摘要:找到字节码并创建一个对象。链接,检验字节码,为字段分配存储空间,解决其对他类的引用。初始化,如果有父类则初始化父类,执行静态初始化器和静态初始化区块直到第一次访问静态成员时初始化才执行。如果成员不是编译时常量由初始化器赋值,也会引起初始化。 有两种形式在运行时获取类型信息: 传统的RTTI 反射 Class对象 运行时的类型信息是通过Class对象表现的,它包含了类的信息。所有...

    liangzai_cool 评论0 收藏0

发表评论

0条评论

zhangwang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<