美文网首页
JDK动态代理和CGLib代理

JDK动态代理和CGLib代理

作者: 轻易流逝 | 来源:发表于2018-09-07 09:26 被阅读0次

    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();
        }
    }
    

    相关文章

      网友评论

          本文标题:JDK动态代理和CGLib代理

          本文链接:https://www.haomeiwen.com/subject/azyawftx.html