JDK動態代理和CGLib代理

weixin_34253539發表於2018-09-07

JDK動態代理:

(必須繼承介面原因:生成的代理需要繼承java.lang.reflect.Proxy類並實現被代理類實現的介面,由於java是單繼承的所以只能代理介面)
1.針對介面實現代理,原理是實現被代理類實現的介面;
2.不能對沒有實現介面的類進行代理;
3.基於反射,實現相同介面

public interface TestInterface {
    void print();
}

public class Test implements TestInterface{
    @Override
    public void print(){
        System.out.println("jdk proxy");
    }
    public static void main(String[] args) throws InterruptedException {
        Test test = new Test();
        Object proxy = Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("方法執行前");
                        Object res =  method.invoke(test, args);
                        System.out.println("方法執行後");
                        return res;
                    }
                });
        TestInterface p = (TestInterface)proxy;
        p.print();
    }

}

CGLib代理:

1.針對類進行代理,原理是生成被代理類的子類,並覆蓋其方法;
2.不能對被final修飾的類進行代理,因為不能繼承final修飾的類;
3.基於asm,修改位元組碼生成子類

先新增cglib的包到專案中

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Test {
    public void print(){
        System.out.println("jdk proxy");
    }
    public static void main(String[] args) throws InterruptedException {
        Test test = new Test();
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(test.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                System.out.println("方法執行前");
                Object res = method.invoke(test, args);
                System.out.println("方法執行後");
                return res;
            }
        });
        Object proxy = enhancer.create();
        Test p = (Test)proxy;
        p.print();
    }
}

相關文章