Типирование с классом, который защищен - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь переопределить некоторый класс веб-проекта vertx, так как мне нужно изменить некоторые функции.Таким образом, здесь возникает сложная часть.

  @Override
  public void reroute(HttpMethod method, String path) {
    int split = path.indexOf('?');

    if (split == -1) {
      split = path.indexOf('#');
    }

    if (split != -1) {
      log.warn("Non path segment is not considered: " + path.substring(split));
      // reroute is path based so we trim out the non url path parts
      path = path.substring(0, split);
    }

    /*((HttpServerRequestWrapper) request).setMethod(method);
    ((HttpServerRequestWrapper) request).setPath(path);*/
    ((HttpServerRequestWrapper) request).setMethod(method);
    ((HttpServerRequestWrapper) request).setPath(path);
    request.params().clear();
    // we need to reset the normalized path
    normalisedPath = null;
    // we also need to reset any previous status
    statusCode = -1;
    // we need to reset any response headers
    response().headers().clear();
    // special header case cookies are parsed and cached
    if (cookies != null) {
      cookies.clear();
    }
    // reset the end handlers
    if (headersEndHandlers != null) {
      headersEndHandlers.clear();
    }
    if (bodyEndHandlers != null) {
      bodyEndHandlers.clear();
    }

    failure = null;
    restart();
  }

Этот код вызывает ошибку компиляции:

'HttpServerRequestWrapper cannot be accessed from outside package'

Я знаю, что мы можем использовать отражение для создания объектов классаэто не может быть доступно.Можно ли использовать отражение в этом случае?Как я могу решить такую ​​проблему.

Любая помощь будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 06 октября 2018

А как насчет получения объекта Class и последующего вызова методов для вашего конкретного (неотмеченного) объекта?

Я предполагаю, что request является атрибутом класса типа HttpServerRequestWrapper.Тогда вот что я предлагаю:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

...

private final Method setMethod;
private final Method setPath;

public MyConstructor() {
    Method tmp1 = null, tmp2 = null;
    try {
        final Class<?> clazz = Class.forName("io.vertx.ext.web.impl.HttpServerRequestWrapper");
        tmp1 = clazz.getMethod("setMethod", HttpMethod.class);
        tmp1.setAccessible(true);
        tmp2 = clazz.getMethod("setPath", String.class);
        tmp2.setAccessible(true);
    } catch (ClassNotFoundException e) {
        // do something
    } catch (NoSuchMethodException e) {
        // do something
    } catch (SecurityException e) {
        // do something
    }
    this.setMethod = tmp1;
    this.setPath = tmp2;
}
...

@Override
public void reroute(HttpMethod method, String path) {
    ...
    try {
        this.setMethod.invoke(request, method);
        this.setPath.invoke(request, path);
    } catch (IllegalAccessException e) {
        // do something
    } catch (IllegalArgumentException e) {
        // do something
    } catch (InvocationTargetException e) {
        // do something
    }
    ...
}

РЕДАКТИРОВАТЬ : я обновил этот ответ, основываясь на предложении @ GotoFinal.

0 голосов
/ 06 октября 2018

В java 8 и / или без модулей можно просто поместить класс, подобный этому, в тот же пакет, что и исходный, чтобы получить доступ ко всем классам пакета по умолчанию.

В противном случае вам нужно использовать отражения, как вдругой ответ, но я бы добавил, что рекомендуется кэшировать этот экземпляр Class и Method, так как использование Class.forName и clazz.getDeclaredMethod каждый раз будет замедлять код.

0 голосов
/ 05 октября 2018

Похоже, что HttpServerRequestWrapper реализует HttpServerRequest.Таким образом, вы можете изменить «HttpServerRequestWrapper» на «HttpServerRequest» в своем коде.Но помните, что при этом вы сможете вызывать только методы, указанные в интерфейсе.

Вы можете увидеть эти методы в https://vertx.io/docs/apidocs/io/vertx/rxjava/core/http/HttpServerRequest.html.

...