JavaSE03_Day01(上)-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;
}