【问题标题】:Why I cannot dynamic load a Class in Servlet?为什么我不能在 Servlet 中动态加载类?
【发布时间】:2021-08-06 13:29:06
【问题描述】:

我最近想做一个 Servlet 演示,用户可以将他们的类文件上传到我的服务器,然后我使用我的 Servlet 读取上传的类中的方法。但我被困在无法动态读取 Servlet 的问题上。这是我的代码:

package TestReflect;

@WebServlet("/showMsg")
public class showMsg extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public showMsg() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        try {
            out.println(ReadClass.getProperty());
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        
        out.flush();
        out.close();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }
}
package ReadClass;

public class ReadClass {
    public static String getProperty() throws ClassNotFoundException {
        try {
            URL url = new URL(null, "file:C:/TestClass/");
            ClassLoader classLoader = new URLClassLoader(new URL[]{url}, ReadClass.class.getClassLoader());
            Class<?> thisClass = classLoader.loadClass("add");
            return thisClass.getMethods()[0].getName();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return "";
}

我得到了错误:

java.lang.ClassNotFoundException: add
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at ReadClass.ReadClass.getProperty(ReadClass.java:12)
    at TestReflect.showMsg.doGet(showMsg.java:48)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:319)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

但是,当我将相同的代码复制到一个普通的java项目中时,并没有出现这个问题,程序运行良好。我检查了很多信息,最相似问题的解决方案是为 ClassLoader 设置父级。如您所见,我的代码中有设置,但仍然报错,您知道为什么吗?

【问题讨论】:

  • 你在那个文件夹中有一个名为add.class的文件吗?
  • 不要尝试加载默认包中的类。
  • @PiotrP.Karwasz 我确定我有一个
  • @MarkRotteveel 这个类是我自己写的,放在自制的floder里。
  • 问题是它在默认包中,并且从默认包之外使用默认包中的东西会带来很多问题(即通常不允许这样做)。我不确定这是否适用于这种情况,但如果这是我自己的代码,这将是我的第一个探索途径。

标签: java tomcat servlets reflection


【解决方案1】:

问题解决了。问题在于服务器端的路径不是它看起来的样子,所以我认为它需要一个绝对路径然后才能完成。

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多