CGLib FixedValue 接口

本文将介绍 CGLib 的 FixedValue 接口

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

沉浸于现实的忙碌之中,没有时间和精力思念过去,成功也就不会太远了。——雷音
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号