Enhancer的简单实践

本文介绍如何使用Spring的CGLIB库中的Enhancer类来实现代理模式,特别是针对没有父接口的类。通过创建Enhancer实例并设置回调,可以拦截目标类的方法调用,实现对方法的增强。

需求:

对指定类的方法做代理。

可以使用Proxy+InvocationHandler实现,但是如果代理类没有父接口的情况下,如何快速实现?

spring的cglib下提供的Enhancer可以快速实现对某个类的所有实例方法(除final)进行代理。

public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(MyHandler.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                System.out.println("before");
                System.out.println(">>>>>>>" + method.getName());
                //注意此处调用的invokeSuper
                Object invoke = methodProxy.invokeSuper(o, objects);
                System.out.println("after");
                return invoke;
            }
        });

        MyHandler handler = (MyHandler) enhancer.create();
        handler.method();
        handler.finalMethod();//没有代理
        handler.protectMethod();
        MyHandler.staticMethod();//没有代理
    }
public class MyHandler {

    public String method(){
        System.out.println("hello Enhancer");
        return "2";
    }

    public final String finalMethod(){
        System.out.println("hello finalMethod");
        return "3";
    }

    public static String staticMethod(){
        System.out.println("hello staticMethod");
        return "4";
    }


    protected String protectMethod(){
        System.out.println("hello protectMethod");
        return "5";
    }
}

总的来说比较方便就实现了对方法的代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值