Java 是否应该对此进行优化?

Java 是否应该对此进行优化?,java,jakarta-ee,Java,Jakarta Ee,这是一个将在Tomcat7.0上运行的servlet。应用程序很忙 我们所做的工作如下: public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //get the path {/api/login} String requestPath = request.getRequestURI().

这是一个将在Tomcat7.0上运行的servlet。应用程序很忙

我们所做的工作如下:

public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //get the path {/api/login}
    String requestPath = request.getRequestURI().substring(request.getRequestURI().indexOf(getServletConfig().getServletContext().getContextPath()) + getServletConfig().getServletContext().getContextPath().length());
    //get the responder class {mobi.foo.base.api.login}
    Class<? extends Responder> responderClass = Class.forName("mobi.foo.base"+requestPath.replaceAll("/", ".")).asSubclass(Responder.class);
    //initialize a responder using reflection
    Responder responder = responderClass.newInstance();

    //print the response
    PrintWriter out = response.getWriter();
    out.write(responder.respond());
    out.close();
}
public void processRequest(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//获取路径{/api/login}
字符串requestPath=request.getRequestURI().substring(request.getRequestURI().indexOf(getServletConfig().getServletContext().getContextPath())+getServletConfig().getServletContext().getContextPath().length());
//获取响应程序类{mobi.foo.base.api.login}
类如果respond()方法只使用方法变量(而不是类字段),则可以创建响应程序并将其放入响应程序池中,然后重用它,而不必每次都创建它

基本上是这样的:

//get the path {/api/login}
String requestPath = request.getRequestURI().substring(request.getRequestURI().indexOf(getServletConfig().getServletContext().getContextPath()) + getServletConfig().getServletContext().getContextPath().length());
//get the responder class {mobi.foo.base.api.login}

String responderName = "mobi.foo.base"+requestPath.replaceAll("/", ".");

Responder responder = responderMap.get(responderName);
if (responder == null) {
    Class<? extends Responder> responderClass = Class.forName("mobi.foo.base"+requestPath.replaceAll("/", ".")).asSubclass(Responder.class);
    //initialize a responder using reflection
    Responder responder = responderClass.newInstance();
    responderMap.put(responderName, responder);
}


//print the response
PrintWriter out = response.getWriter();
out.write(responder.respond());
out.close();
//获取路径{/api/login}
字符串requestPath=request.getRequestURI().substring(request.getRequestURI().indexOf(getServletConfig().getServletContext().getContextPath())+getServletConfig().getServletContext().getContextPath().length());
//获取响应程序类{mobi.foo.base.api.login}
字符串responderName=“mobi.foo.base”+requestPath.replaceAll(“/”,”);
Responder Responder=responderMap.get(responderName);
if(响应程序==null){

类Q:应该优化吗

答:使用探查器测量在关注代码中花费的时间百分比。如果时间百分比很重要,则对其进行优化。否则不要

当然,我们不能给你一个“重要”的明确量化。这实际上取决于实际成本。例如,如果您有一个webapp实例,并且它大部分时间都是轻加载的,那么性能提高1%很可能是不值得的。另一方面,如果您在数千台服务器上运行了数千份此程序的副本,则性能提高1%n性能可能是值得的…只是为了减少电费


它能被优化吗

我认为不太可能有太多的加速。用工厂对象的
HashMap
查找替换
class.forName
newInstance()
,等等,每次调用可能会节省几分之一微秒。这可能相当于显著的加速……但我对此表示怀疑

然而,我认为@JBNizet提出了一个重要的观点。这里有一个潜在的安全问题。解决这个问题将是彻底修改此代码的合理理由



1-加载类的成本随着请求类型的重复而分摊。当您调用以前加载过的类的
class.forName
时,类加载器只需查找并返回一个现有的
class
对象。

您是否有性能问题?您是否已证明此性能问题源自此问题一段代码?如果您对这些问题中的任何一个回答都是否定的,那么您就不应该进行优化。也就是说,您似乎正在重新创建一个基于操作的框架。为什么不使用一个真正的框架呢?或者干脆使用几个映射到URL的servlet?这可能会导致安全问题:它允许任何人让服务器加载mobi.foo.base*中的任何类。