Servlet无法动态读取Class

发布于 2022-09-13 00:56:29 字数 3429 浏览 26 评论 0

题目描述

最近我想做一个Servlet的demo。这个demo中用户可以将自己的class文件上传到我的服务器中,然后我用我的Servlet读取用户上传的class中的方法。但我卡在Serlvet无法动态读取类这个环节。

代码

代码1 showMsg (Servlet)

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
    }
}

代码2 ReadClass (java)

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 "";
        /*
        File myFolder = new File("file:C:/TestClass/");
        URLClassLoader classLoader = null;
        try {
            classLoader = new URLClassLoader(new URL[]{myFolder.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        }
        
        System.out.println(classLoader);
        //获取对象类型    包名.类名   ?代表任意类型对象
        Class<?> classType=Class.forName("add", true, classLoader);

        Object obj = null;
        try {
            obj = classType.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        //获取对象中的所有方法
        Method[] methods = classType.getDeclaredMethods();
        try {
            return methods[0].invoke(obj).toString();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        return "";
        */
    }
}

补充说明

我要读取的class的路径是“C:/TestClass/add.class”

相关问题

但当我把相同的代码复制到普通的java项目中时,这个问题却没有出现,程序能完美的运行。我查了很多资料,最相近的问题的解决方案是让我给ClassLoader设置一个家长。如你们所见,我的代码中有设置,但是仍旧报错,请问大家知道原因吗

相似问题的链接

https://stackoverflow.com/que...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文