为了账号安全,请及时绑定邮箱和手机立即绑定

使用受保护的类进行类型转换

使用受保护的类进行类型转换

幕布斯7119047 2021-10-28 15:45:14
我正在尝试覆盖某类 vertx web 项目,因为我必须更改某些功能。所以棘手的部分来了。  @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 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

在 java 8 和/或没有模块的情况下,可以将类似的类放在与原始包相同的包中以访问所有包默认类。

否则,你需要在其他响应使用反射像,但我想补充一点,这是好主意,缓存ClassMethod实例,如使用Class.forNameclazz.getDeclaredMethod每次都会放缓代码。


查看完整回答
反对 回复 2021-10-28
?
撒科打诨

TA贡献1934条经验 获得超2个赞

获取Class对象然后调用特定(未转换)对象上的方法怎么样?


我假设request是 type 的类属性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 的建议更新了这个答案。


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信