alibaba / jvm-sandbox

Real - time non-invasive AOP framework container based on JVM
GNU Lesser General Public License v3.0
6.76k stars 1.56k forks source link

希望能支持将使用field的地方改写为通过方法获取field value #416

Open Aresxue opened 1 year ago

Aresxue commented 1 year ago

以下提议都是在agent模式下

原始诉求为在流量回放时录制回放spring的config

以下面的类为例

@RestController
@RequestMapping("/test")
public class TestController {

  @Value("${name:ares}")
  private String name;

  @GetMapping("/getName")
  public String test() {
    return name;
//  检查是否存在getName方法没有则构造一个并将使用name的地方替换为getName(), 如
//    return getName();
  }

//  public String getName() {
//    return name;
//  }

}

name字段是从配置中加载,线上环境和回放环境中配置可能会不一样,所以想在录制时就把该值录制下来,回放时使用录制的值。 但name是一个field而不是method所以想sandbox能提供一种机制将field转为method,以上面为例讲field name转为getName方法, 对于我而言就转变成了将所有spring的bean中带有org.springframework.beans.factory.annotation.Value注解的field转为method然后对这些method进行录制回放即可。

ShiningXu commented 1 year ago

顶一个! 有同样的需求,希望sandbox不仅仅是增强方法,也可以直接"增强"一个类中的某个静态变量

oldmanpushcart commented 1 year ago

现有sandbox的字节码工程架构不能很好的满足这个代码增强,需要一个比较大版本的工程迭代。需求收到,但短期内无法满足。

Aresxue commented 1 year ago

现有sandbox的字节码工程架构不能很好的满足这个代码增强,需要一个比较大版本的工程迭代。需求收到,但短期内无法满足。

问了doom那边就是走的生成私有synthetic方法,然后替换所有field的引用为这个method的应用这个思路,或许你们可以交流下?

oldmanpushcart commented 1 year ago

@Aresxue 感谢建议,安排人手进行调研去~

guozhao1225 commented 1 year ago

@oldmanpushcart 请问这个issue近期有计划解决安排实现吗?

RadhikaGalih commented 1 week ago

直接根据sandbox改下源码,自己注册transformer,可以暂时先满足诉求