类名:org.test.ClassName
方法名称:方法1
实际返回类型:ResponseEntity
RULE a
CLASS org.test.ClassName
METHOD method1
AT EXIT
IF true
DO
return new Task();
ENDRULE
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 更改方法的返回类型。
但是,您可以更改方法的返回值,只要返回的值具有相同的类型即可。
您的规则不起作用的原因是您尝试使用模板参数。模板参数在 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