在 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”字符串。