JavaSE03_Day01(上)-WebServer项目(十三):重构代码、反射(定义、优势、注意事项、获取反射对象、实例化对象)

一、webserver项目

1.1 版本十三:重构代码

  在cn.tedu.core包下新建一个ServletContext类,用于优化在ClientHandler类中频繁添加判断修改业务。

ServletContext.java

 package cn.tedu.core;
 /**
  * 用于保存服务器请求路径对应的Servlet类对象
  * @author cjn
  *
  */
 import java.util.HashMap;
 import java.util.Map;
 import cn.tedu.servlets.HttpServlet;
 import cn.tedu.servlets.LoginServlet;
 import cn.tedu.servlets.RegServlet;
 
 public class ServletContext {
     //声明Map属性,key用于存储业务的请求路径,value用于存储对应的servlet类的对象
     private static Map<String, HttpServlet> servletMapping =
             new HashMap<String, HttpServlet>();
 
     /**
      * 静态块
      * 用于在类加载时期进行调用initServletMapping方法,
      * 并且往属性Map中添加元素内容
      */
     static {
         initServletMapping();
    }
     
     /**
      * 该方法用于向Map属性中添加具体的信息数据
      */
     private static void initServletMapping() {
         //注册请求路径和注册业务处理的业务类的实例存储到map中
         servletMapping.put("/myweb/reg", new RegServlet());
         //登录请求路径和登录业务处理的业务类的实例存储到map中
         servletMapping.put("/myweb/login", new LoginServlet());
    }
     
     /**
      * 对外提供可以通过业务请求路径进行获取业务实例对象的方法
      */
     public static HttpServlet getServlet(String path) {
         return servletMapping.get(path);    
    }
   
 }

修改ClientHander类

测试:启动webserver项目主类,然后打开浏览器,在浏览器的地址栏中输入请求http://localhost:8888/myweb/reg.html显示一个注册页面,在页面中添写注册信息,然后再在浏览器的地址栏中输入请求http://localhost:8888/myweb/login.html显示一个登录页面,在页面中填写登录信息,然后再进行确认登录业务逻辑是否正常。

 

二、反射

(必须会,开发时书写不一定很多,但是在使用第四阶段所学习的框架中,框架的底层会应用反射)

2.1 定义

  反射是一个动态机制,允许我们在书写代码程序以后,在程序的运行时期再进行决定对象的实例化,或者是调用相关的属性或者方法,并且在运行时期动态的得知一个类具体情况(类有哪些方法,类有哪些属性)。

2.2 反射优势

  使用反射可以在程序运行的时期,再进行确定后面具体要执行的代码内容,就好比是生活中包老师在上班路上遇到了大雨,然后去便利店买了一把雨伞。也就是使用反射以后,会根据具体的情况去灵活性的执行不同的逻辑,会提高程序中代码的灵活程度(“见机行事”)。

2.3 反射使用注意事项

  程序中不要大量使用反射,如果使用反射较多,虽然可以提高程序的灵活成都,但是整个程序在运行期间,对于内存的开销是较大的,也会影响程序执行的效率,所以说适当使用反射技术。

2.4 获取反射对象

  • 类名.class

  每个类都由一个静态属性class。可以通过该属性直接获取这个类的类对象。如果以后在使用的时候,希望明确获取某个类的类对象(反射对象)的时候,使用该方案。

  Class cla = String.class;

  • Class.forName();

  如果需要进行根据具体的类的名字来进行获取类对象(反射对象),也可以进行调用Class类所提供的forName静态方法。

  Class cla = Class.forName("java.lang.String");

  • 类的对象.getClass();

  如果希望通过一个具体的类的对象,进行获取类对象(反射对象),可以通过类的对象调用对象方法getClass()进行获取类对象。

  String str = "达内Java顶呱呱";

  Class cla = str.getClass();

 package cn.tedu.reflect;
 
 import java.lang.reflect.Method;
 
 /**
  * 获取反射对象案例演示
  * @author cjn
  *
  */
 public class ReflectDemo01 {
 
     public static void main(String[] args) throws ClassNotFoundException {
         //方案一:
         Class cla = String.class;
         
         //方案二:
         cla = Class.forName("java.io.File");
         
         //方案三:
         String str = "达内Java顶呱呱";
         cla = str.getClass();
         /*
          * 获取类对象的名字
          * 例如:获取字符串类对象的名字,在进行获取的时候
          * 会连同包的名字一同输出
          */
         String name = cla.getName();
         System.out.println("类对象名字为:" + name);
         
         //获取这个类的所有公开方法
         Method[] methods = cla.getMethods();
         System.out.println(methods.length);
         for (Method m : methods) {
             System.out.println(m.getName());
        }
    }
 
 }

2.5 反射进行实例化对象

Person.java

 package cn.tedu.reflect;
 /**
  * 用于进行测试反射的模板类
  * @author cjn
  *
  */
 public class Person {
     
     private Integer id;//id
     public String name;//姓名 注意此处是public
     private String gender;//性别
     private Integer age;//年龄
     
     /*
      * 1.生成无参构造器
      * 2.生成有参构造器
      * 3.生成set和get方法
      * 4.生成toString方法
      * 5.生成equals和hashCode方法
      * 6.将当前属性的访问控制修饰符更改一个为public
      */
     public Person(Integer id, String name, String gender, Integer age) {
         super();
         this.id = id;
         this.name = name;
         this.gender = gender;
         this.age = age;
    }
 
     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
         result = prime * result + ((age == null) ? 0 : age.hashCode());
         result = prime * result + ((gender == null) ? 0 : gender.hashCode());
         result = prime * result + ((id == null) ? 0 : id.hashCode());
         result = prime * result + ((name == null) ? 0 : name.hashCode());
         return result;
    }
 
     @Override
     public boolean equals(Object obj) {
         if (this == obj)
             return true;
         if (obj == null)
             return false;
         if (getClass() != obj.getClass())
             return false;
         Person other = (Person) obj;
         if (age == null) {
             if (other.age != null)
                 return false;
        } else if (!age.equals(other.age))
             return false;
         if (gender == null) {
             if (other.gender != null)
                 return false;
        } else if (!gender.equals(other.gender))
             return false;
         if (id == null) {
             if (other.id != null)
                 return false;
        } else if (!id.equals(other.id))
             return false;
         if (name == null) {
             if (other.name != null)
                 return false;
        } else if (!name.equals(other.name))
             return false;
         return true;
    }
 
     @Override
     public String toString() {
         return "Person [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
    }
 
     public Integer getId() {
         return id;
    }
 
     public void setId(Integer id) {
         this.id = id;
    }
 
     public String getName() {
         return name;
    }
 
     public void setName(String name) {
         this.name = name;
    }
 
     public String getGender() {
         return gender;
    }
 
     public void setGender(String gender) {
         this.gender = gender;
    }
 
     public Integer getAge() {
         return age;
    }
 
     public void setAge(Integer age) {
         this.age = age;
    }
 
     public Person() {
         super();
    }
     
 }

ReflectDemo02.java

 package cn.tedu.reflect;
 /**
  * 通过反射进行实例化对象
  * @author cjn
  *
  */
 public class ReflectDemo02 {
 
     public static void main(String[] args) throws Exception {
         Class<Person> cla = Person.class;
         //实例化对象
         Person person = (Person)cla.newInstance();
         person.name = "包佳奇";
         System.out.println(person);
 
    }
 
 }

注意:Person类如果没有无参构造器,无法进行通过以上案例实例化对象,会报出实例化对象异常。

 

posted @ 2021-07-24 23:52  Coder_Cui  阅读(135)  评论(0编辑  收藏  举报