关于控制器改用单例模式对GlobalController中反射的影响
来源:5-1 课程总结
Wonwayshon
2021-02-05 10:08:06
老师,如果将控制器全部改写为单例模式,构造方法私有然后提供一个获取实例的方法,那么GlobalController中反射部分使用newInstance()方法创建控制器对象的过程会受到影响吗?控制器改写为单例模式后原有的GlobalController能直接使用吗?还是说需要做一些修改呢?
package com.imooc.icake.global;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GlobalController extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
String path= request.getServletPath();
if(path.indexOf("/admin")!=-1){
path=path.substring(7);
}else{
path=path.substring(1);
}
int index=path.indexOf("/");
String className="com.imooc.icake.controller.";
String methodName=null;
if(index!=-1){
className=className+path.substring(0,index)+"Controller";
methodName=path.substring(index+1,path.indexOf(".do"));
}else{
className=className+"DefaultController";
methodName=path.substring(0,path.indexOf(".do"));
}
try {
Class clazz=Class.forName(className);
Object object=clazz.newInstance();
Method method=clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(object,request,response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
1回答
同学你好,newInstance()是通过无参构造方法实例对象,如果没有无参构造方法,或者无参构造方法设置为private的,使用newInstance()实例对象会报错。
如果所有的Controller类都改为单例,构造方法私有,提供实例方法。在GlobalController类中,如下代码实例对象的代码需要修改
增加if判断,判断className并实例该对象,使用实例的对象调用对应的方法。多个Controller,需要多个判断,实例多个对象。所以不建议Controller改成单例。
祝学习愉快~
相似问题