如何在使用byte buddy时清除缓存

时间:2018-02-02 12:29:40

标签: java javaagents byte-buddy

package com.example;

public class Car {

    private String name;
    private String model;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getModel() {
        return model;
    }
    public void setModel(String model) {
        this.model = model;
    }
}

另一类Dependent是

package com.example;

public class Dependent {

    public  Car callMethod2(){

        Car car = new Car();
        car.setModel("2009");
        car.setName("Tata");
        return car;
    }
}

另一类Main是

package com.example;

public class Main {

    public static String callMethod1(){
        return "Hello from callMethod1";
    }

    public static Car callingCall2(){
        Dependent call = new Dependent();
        Car args= call.callMethod2();

        return args;
    }
}

另一类MainTest是

package com.example;

import static net.bytebuddy.implementation.MethodDelegation.to;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static org.junit.Assert.assertEquals;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.agent.ByteBuddyAgent;
import net.bytebuddy.dynamic.loading.ClassReloadingStrategy;

import org.junit.Test;

public class MainTest {

@Test
public void Test1_withByteBuddy()
        throws Exception {
    ByteBuddyAgent.install();
    new ByteBuddy()
            .redefine(Dependent.class)
            .method(named("callMethod2"))
            .intercept(to(Cardetails.class))
            .make()
            .load(MainTest.class.getClassLoader(),
                    ClassReloadingStrategy.fromInstalledAgent());
    Car car = Main.callingCall2();
    System.out.println(car.getModel());
    System.out.println(car.getName());
    assertEquals("2011",car.getModel());
    assertEquals("Maruti",car.getName());
}

public static class Cardetails {
    public static Car car() {
        Car carTest = new Car();
        carTest.setModel("2011");
        carTest.setName("Maruti");
        return carTest;
    }
}

@Test
public void Test2_withOutByteBuddy()
        throws Exception {
    Car car = Main.callingCall2();
    System.out.println(car.getModel());
    System.out.println(car.getName());
    assertEquals("2009",car.getModel());
    assertEquals("Tata",car.getName());
}
}

在我运行MainTest时,第二种方法Test2_withOutByteBuddy()失败了。为什么因为它从方法Test1_withByteBuddy()获取由字节伙伴生成的值。那么,在这里我如何清除字节伙伴执行完成后生成的值以及如何从方法Test2_withOutByteBuddy()获取我期望的值。

1 个答案:

答案 0 :(得分:0)

您可以调用:

ClassReloadingStrategy.fromInstalledAgent().reset(Dependent.class)

这样做,Byte Buddy将类重置为其原始的类文件表示。

理想情况下,您应该在try-finally块或@After方法中执行此操作,以确保即使测试失败也能重置。