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";
    }
}

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

你可能感兴趣的:(Java,java)