Thread.currentThread()。setContextClassLoader不使用反射

时间:2011-09-17 04:21:47

标签: java

我在test.jar中有一个“com.test.Test1”类。我使用这个jar进行编译,但不使用我的webapp进行部署。我希望我的servlet在运行时动态加载这个jar。

有没有办法在不使用Java反射的情况下动态加载类?我问这个的原因是因为我不想将大量的现有代码转换为java反射。

public class servlet1 extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {

        URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { new File("test.jar").toURI().toURL() }, null);
        Thread.currentThread().setContextClassLoader(urlClassLoader);
         Class c = newClassLoader.loadClass("com.test.Test1");

        //////
        Test1 test1 = new Test1() ==> ClassNotFound Exception
        test1.testMeothod();
        ///////    

        // if using java reflection will work
        c.newInstance() ...........
        Method m = c.getDeclaredMethod("startup", null);
        .....
        .....
        //////    
    }
}

2 个答案:

答案 0 :(得分:1)

您可以通过这种方式加载类,但不能在代码中命名它们。您必须通过类扩展中存在的扩展/实现的某个基类或接口来引用它们。如果类具有默认构造函数,则不必使用Reflection,只需Class.newInstance()

答案 1 :(得分:0)

您可以重构代码以提取Test1的界面。 因此,您可以直接使用您的界面而无需反射。 建议使用接口,因为使用抽象类会导致 在其他类加载器中加载子类时有些麻烦。

你可以在这里找到麻烦。

ClassCircularityError is thrown when getCanonicalName