关于Java反射和多态结合的问题

Javaee中有HttpServlet类,当我们自己实现servlet时tomcat会调用我们自己定义的doGet等方法,单纯的Java多态也好实现,HttpServlet servlet=new MyServlet(),此时可以很简单的实现调用我们自定义的doGet,doPost等方法。但是tomcat是利用反射去加载我们自定义servlet的,所以我的问题在于,结合反射的情况下,如何根据父类类名去调用子类方法,实现Java多态(不考虑子类的扩展方法)

阅读 3k
1 个回答

结合反射的话不应该是:

  1. 通过 web.xml 告知 tomcat 自定义 Servlet 的全限定名
  2. tomcat 通过 Class.forName("全限定名") 获取 Class
  3. 然后可以这样写:
HttpServlet servlet = HttpServlet.class.cast(
    Class.forName("***").getConstructor(Class<?>... parameterTypes)
                        .newInstance(Object ... initargs))

并不是说非要用反射取到方法体才能调用。

如果说一定要只通过方法体来执行:

public class A {
    public void a() {
      System.out.println("a");
    }
}
public B extends A {}

public class C {
    public static void main(String ...args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Method method = A.class.getMethod("a");
        method.invoke(new B());
    }
}

这里的问题就是如何得到 new B(),这在前面已经讲过了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进