Java 为什么HttpServletRequestWrapper类不是抽象类

Java 为什么HttpServletRequestWrapper类不是抽象类,java,servlets,Java,Servlets,这个类不应该是抽象的吗?如果我直接使用它,它无论如何都会给我一个默认对象,因此我必须对它进行子类化,并覆盖我关注的方法。我使用它的方式如下: public class HttpRequestWrapper extends HttpServletRequestWrapper { private static final Logger logger = LoggerFactory .getLogger(HttpRequestWrapper.class); pr

这个类不应该是抽象的吗?如果我直接使用它,它无论如何都会给我一个默认对象,因此我必须对它进行子类化,并覆盖我关注的方法。我使用它的方式如下:

public class HttpRequestWrapper extends HttpServletRequestWrapper {
    private static final Logger logger = LoggerFactory
            .getLogger(HttpRequestWrapper.class);
    private final byte[] body;
    private static Gson gson = new Gson();

    public HttpRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        // Read the request body and save it as a byte array
        InputStream is = super.getInputStream();
        body = IOUtils.toByteArray(is);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        return new ServletInputStreamImpl(new ByteArrayInputStream(body));
    }

    @Override
    public BufferedReader getReader() throws IOException {
        String encBody = getCharacterEncoding();
        if (encBody != null && encBody != enc) {
            enc = encBody;
        }
        return new BufferedReader(new InputStreamReader(getInputStream(), enc));
    }
        xxxxxxxx more code xxxxxx
 }
我不理解直接创建HttpServletRequestWrapper对象的好处,因此为什么不抽象?我是否缺少一些关键的洞察力?包装器(我正在做的)是多余的吗


更新1:有没有其他库可以用来实现相同的功能?

这个类使用了Decorator设计模式,它用于包装一个有效的HttpServletRequest,它使您可以覆盖这些接口的行为。它意味着用期望的行为装饰类,这就是这个类不能抽象的原因

请记住,当请求到达服务器时,容器会创建HttpServletRequest的对象实现,此时您无法移动对象中的任何内容,例如方法的实现,这就是为什么您使用具体类HttpServletRequestWrapper进行包装的原因


此类通常与过滤器一起使用,以便在不移动servlet内的代码的情况下添加一些框外特性,考虑使用拦截筛选器设计模式。包装原始请求并使用doFilter方法将其发送到servlet

实际上,此类的默认行为是退回到默认实现,同样的行为也可以通过将其抽象来实现。可以定义一个抽象类并提供所有方法的实现。抽象的好处在于,它不会让开发人员怀疑它可以直接用作包装类。