在 CGLib 中,FixedValue 接口是 Enhancer 回调类型,它用来返回一个固定值,该值为要从代理方法返回的值。该回调接口仅仅定义了一个 loadObject() 方法,定义如下:
java.lang.Object loadObject() throws java.lang.Exception
返回原始方法调用应返回的对象,每次方法调用都会调用此方法。
FixedValue 回调接口的 loadObject() 方法没有定义关于正在调用什么方法的信息,并且返回对象的类型必须与代理方法的返回类型兼容。这使得此回调主要用于强制特定方法,通过使用 CallbackFilter 以很少的开销返回固定值。
(1)定义被代理的类,代码如下:
/**
* 被代理的类
* @author hxstrive.com 2021/12/29
*/
public class HelloWorld {
public String test(String msg) {
return msg;
}
}(2)客户端代码,
import com.hxstrive.cglib.callback.demo4.HelloWorld;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.FixedValue;
/**
* 验证 setCallback() 设置 FixedValue 接口
* @author hxstrive.com 2021/12/31
*/
public class CglibDemo {
public CglibDemo() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(HelloWorld.class);
enhancer.setCallback(new FixedValue() {
@Override
public Object loadObject() throws Exception {
// 返回一个固定值
return "fixed Value";
}
});
HelloWorld sample = (HelloWorld) enhancer.create();
// 调用目标方法
String result = sample.test("hello world");
System.out.println("result = " + result);
}
public static void main(String[] args) {
new CglibDemo();
}
}运行客户端程序,输出如下:
result = fixed Value
上面代码中,调用 test("hello world") 方法,正常情况下应该返回“hello world”字符串。但是,我们使用了 CGLib 的 FixedValue 回调接口在每次调用目标方法时,返回固定字符串“fixed Value”。因此,我们最终输出的结果并不是“hello world”字符串,而是“fixed Value”字符串。