我在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);
.....
.....
//////
}
}
答案 0 :(得分:1)
您可以通过这种方式加载类,但不能在代码中命名它们。您必须通过类扩展中存在的扩展/实现的某个基类或接口来引用它们。如果类具有默认构造函数,则不必使用Reflection,只需Class.newInstance()
。
答案 1 :(得分:0)
您可以重构代码以提取Test1的界面。 因此,您可以直接使用您的界面而无需反射。 建议使用接口,因为使用抽象类会导致 在其他类加载器中加载子类时有些麻烦。
你可以在这里找到麻烦。