Byteman java代理:如何更改类方法的返回类型

问题描述 投票:0回答:1

类名:org.test.ClassName 方法名称:方法1 实际返回类型:ResponseEntity 预期响应:任务,即。 {“id”:“测试”}

  1. 我的要求是拦截响应并将其响应修改为上面给出的预期响应。我试图修改 return 语句中的返回对象,但 byteman 抛出一个错误,返回类型无法更改。如何实现这一目标?尝试了以下,但没有成功
RULE a
CLASS org.test.ClassName
METHOD method1
AT EXIT
IF true
DO
    return new Task();
ENDRULE

  1. 其他要求是更改实际返回类型的属性本身,即。该方法的响应是 ResponseEntity<>(new Task, HttpStatus.OK),我想将返回属性更改为 ResponseEntity<>(new Task, HttpStatus.FORBIDDEN)。如何实现这一目标?尝试了以下,但没有成功
RULE a
CLASS com.vmware.mangle.services.controller.TestController
METHOD getUser
AT EXIT
IF TRUE
DO
    ResponseEntity<Resource<User>> responseEntity = $!;
    HttpStatus httpStatus = responseEntity.getStatusCode();
    
    if (httpStatus == HttpStatus.OK) {
        ResponseEntity<Resource<User>> newResponseEntity =
            new ResponseEntity<>(responseEntity.getBody(), HttpStatus.BAD_REQUEST);
        $! = newResponseEntity;
    }
ENDRULE
byteman
1个回答
0
投票

您无法使用 Byteman 更改方法的返回类型。

但是,您可以更改方法的返回值,只要返回的值具有相同的类型即可。

您的规则不起作用的原因是您尝试使用模板参数。模板参数在 Java 源代码中有效,但在 Byetman 规则中无效。这是因为 Byteman 为注入规则而必须转换的字节码不包含模板参数的详细信息。它们被 javac 编译器删除。

如果您更改规则以省略模板参数,它应该可以工作。这是我建议你尝试的方法:

RULE a
CLASS com.vmware.mangle.services.controller.TestController
METHOD getUser
AT EXIT
IF TRUE
DO
    ResponseEntity responseEntity = $!;
    HttpStatus httpStatus = responseEntity.getStatusCode();

    if (httpStatus == HttpStatus.OK) {
        ResponseEntity newResponseEntity =
            new ResponseEntity(responseEntity.getBody(), HttpStatus.BAD_REQUEST);
        $! = newResponseEntity;
    }
ENDRULE
© www.soinside.com 2019 - 2024. All rights reserved.