精华内容
下载资源
问答
  • 这是目录jdk动态代理cglib动态代理cglib代理接口cglib代理实现类对比源码版权所有 jdk动态代理 jdk动态代理只可以代理接口,因为最后的实现类要继承Proxy并实现该接口 cglib动态代理 cglib既可代理接口又可以代理...

    jdk动态代理

    jdk动态代理只可以代理接口,因为最后的实现类要继承Proxy并实现该接口

    cglib动态代理

    cglib既可代理接口又可以代理实现类,那背后的源码是如何实现的呢?

    cglib代理接口

    1. 接口代码
    package com.tqy.document.reader.extention.demo1;
    
    /**
     * @author tengqingya
     * @create 2019-04-23 12:49
     */
    public interface TestInterface {
        String getHalloWorld();
    }
    
    
    1. MethodInterceptor代码
    package com.tqy.document.reader.extention.demo1;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * @author tengqingya
     * @create 2019-04-23 12:49
     */
    
    public class TestCGLib implements MethodInterceptor {
    
        public Object getInstance(Class claxx) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(claxx);
            // 回调方法
            enhancer.setCallback(this);
            // 创建代理对象
            return enhancer.create();
        }
    
        @Override
        public Object intercept( Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    //        methodProxy.invokeSuper(o,objects);
            return method.getName();
        }
    }
    
    1. main函数
    package com.tqy.document.reader.extention.demo1;
    
    import net.sf.cglib.core.DebuggingClassWriter;
    
    /**
     * @author tengqingya
     * @create 2019-04-23 12:50
     */
    public class TestCGLibMain {
        public static void main(String[] args) {
            System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\gitCode\\mySpring\\DcumentReader\\src\\main\\java\\com\\tqy\\document\\reader\\extention\\demo1");
    
            TestCGLib testCGLib = new TestCGLib();
            TestInterface o = (TestInterface) testCGLib.getInstance(TestInterface.class);
            System.out.println(o.getHalloWorld());
        }
    }
    
    1. 运行结果
    CGLIB debugging enabled, writing to 'D:\gitCode\mySpring\DcumentReader\src\main\java\com\tqy\document\reader\extention\demo1'
    getHalloWorld
    
    1. 生成的源码
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.tqy.document.reader.extention.demo1;
    
    import java.lang.reflect.Method;
    import net.sf.cglib.core.ReflectUtils;
    import net.sf.cglib.core.Signature;
    import net.sf.cglib.proxy.Callback;
    import net.sf.cglib.proxy.Factory;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class TestInterface$$EnhancerByCGLIB$$72f42620 implements TestInterface, Factory {
        private boolean CGLIB$BOUND;
        private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
        private static final Callback[] CGLIB$STATIC_CALLBACKS;
        private MethodInterceptor CGLIB$CALLBACK_0;
        private static final Method CGLIB$finalize$0$Method;
        private static final MethodProxy CGLIB$finalize$0$Proxy;
        private static final Object[] CGLIB$emptyArgs;
        private static final Method CGLIB$equals$1$Method;
        private static final MethodProxy CGLIB$equals$1$Proxy;
        private static final Method CGLIB$toString$2$Method;
        private static final MethodProxy CGLIB$toString$2$Proxy;
        private static final Method CGLIB$hashCode$3$Method;
        private static final MethodProxy CGLIB$hashCode$3$Proxy;
        private static final Method CGLIB$clone$4$Method;
        private static final MethodProxy CGLIB$clone$4$Proxy;
        private static final Method CGLIB$getHalloWorld$5$Method;
        private static final MethodProxy CGLIB$getHalloWorld$5$Proxy;
    
        static void CGLIB$STATICHOOK1() {
            CGLIB$THREAD_CALLBACKS = new ThreadLocal();
            CGLIB$emptyArgs = new Object[0];
            Class var0 = Class.forName("com.tqy.document.reader.extention.demo1.TestInterface$$EnhancerByCGLIB$$72f42620");
            Class var1;
            Method[] var10000 = ReflectUtils.findMethods(new String[]{"finalize", "()V", "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;"}, (var1 = Class.forName("java.lang.Object")).getDeclaredMethods());
            CGLIB$finalize$0$Method = var10000[0];
            CGLIB$finalize$0$Proxy = MethodProxy.create(var1, var0, "()V", "finalize", "CGLIB$finalize$0");
            CGLIB$equals$1$Method = var10000[1];
            CGLIB$equals$1$Proxy = MethodProxy.create(var1, var0, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$1");
            CGLIB$toString$2$Method = var10000[2];
            CGLIB$toString$2$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "toString", "CGLIB$toString$2");
            CGLIB$hashCode$3$Method = var10000[3];
            CGLIB$hashCode$3$Proxy = MethodProxy.create(var1, var0, "()I", "hashCode", "CGLIB$hashCode$3");
            CGLIB$clone$4$Method = var10000[4];
            CGLIB$clone$4$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/Object;", "clone", "CGLIB$clone$4");
            CGLIB$getHalloWorld$5$Method = ReflectUtils.findMethods(new String[]{"getHalloWorld", "()Ljava/lang/String;"}, (var1 = Class.forName("com.tqy.document.reader.extention.demo1.TestInterface")).getDeclaredMethods())[0];
            CGLIB$getHalloWorld$5$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "getHalloWorld", "CGLIB$getHalloWorld$5");
        }
    
        final void CGLIB$finalize$0() throws Throwable {
            super.finalize();
        }
    
        protected final void finalize() throws Throwable {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                var10000.intercept(this, CGLIB$finalize$0$Method, CGLIB$emptyArgs, CGLIB$finalize$0$Proxy);
            } else {
                super.finalize();
            }
        }
    
        final boolean CGLIB$equals$1(Object var1) {
            return super.equals(var1);
        }
    
        public final boolean equals(Object var1) {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                Object var2 = var10000.intercept(this, CGLIB$equals$1$Method, new Object[]{var1}, CGLIB$equals$1$Proxy);
                return var2 == null ? false : (Boolean)var2;
            } else {
                return super.equals(var1);
            }
        }
    
        final String CGLIB$toString$2() {
            return super.toString();
        }
    
        public final String toString() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            return var10000 != null ? (String)var10000.intercept(this, CGLIB$toString$2$Method, CGLIB$emptyArgs, CGLIB$toString$2$Proxy) : super.toString();
        }
    
        final int CGLIB$hashCode$3() {
            return super.hashCode();
        }
    
        public final int hashCode() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                Object var1 = var10000.intercept(this, CGLIB$hashCode$3$Method, CGLIB$emptyArgs, CGLIB$hashCode$3$Proxy);
                return var1 == null ? 0 : ((Number)var1).intValue();
            } else {
                return super.hashCode();
            }
        }
    
        final Object CGLIB$clone$4() throws CloneNotSupportedException {
            return super.clone();
        }
    
        protected final Object clone() throws CloneNotSupportedException {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            return var10000 != null ? var10000.intercept(this, CGLIB$clone$4$Method, CGLIB$emptyArgs, CGLIB$clone$4$Proxy) : super.clone();
        }
    
        final String CGLIB$getHalloWorld$5() {
            return super.getHalloWorld();
        }
    
        public final String getHalloWorld() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            return var10000 != null ? (String)var10000.intercept(this, CGLIB$getHalloWorld$5$Method, CGLIB$emptyArgs, CGLIB$getHalloWorld$5$Proxy) : super.getHalloWorld();
        }
    
        public static MethodProxy CGLIB$findMethodProxy(Signature var0) {
            String var10000 = var0.toString();
            switch(var10000.hashCode()) {
            case -1662339427:
                if (var10000.equals("getHalloWorld()Ljava/lang/String;")) {
                    return CGLIB$getHalloWorld$5$Proxy;
                }
                break;
            case -1574182249:
                if (var10000.equals("finalize()V")) {
                    return CGLIB$finalize$0$Proxy;
                }
                break;
            case -508378822:
                if (var10000.equals("clone()Ljava/lang/Object;")) {
                    return CGLIB$clone$4$Proxy;
                }
                break;
            case 1826985398:
                if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
                    return CGLIB$equals$1$Proxy;
                }
                break;
            case 1913648695:
                if (var10000.equals("toString()Ljava/lang/String;")) {
                    return CGLIB$toString$2$Proxy;
                }
                break;
            case 1984935277:
                if (var10000.equals("hashCode()I")) {
                    return CGLIB$hashCode$3$Proxy;
                }
            }
    
            return null;
        }
    
        public TestInterface$$EnhancerByCGLIB$$72f42620() {
            CGLIB$BIND_CALLBACKS(this);
        }
    
        public static void CGLIB$SET_THREAD_CALLBACKS(Callback[] var0) {
            CGLIB$THREAD_CALLBACKS.set(var0);
        }
    
        public static void CGLIB$SET_STATIC_CALLBACKS(Callback[] var0) {
            CGLIB$STATIC_CALLBACKS = var0;
        }
    
        private static final void CGLIB$BIND_CALLBACKS(Object var0) {
            TestInterface$$EnhancerByCGLIB$$72f42620 var1 = (TestInterface$$EnhancerByCGLIB$$72f42620)var0;
            if (!var1.CGLIB$BOUND) {
                var1.CGLIB$BOUND = true;
                Object var10000 = CGLIB$THREAD_CALLBACKS.get();
                if (var10000 == null) {
                    var10000 = CGLIB$STATIC_CALLBACKS;
                    if (CGLIB$STATIC_CALLBACKS == null) {
                        return;
                    }
                }
    
                var1.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])var10000)[0];
            }
    
        }
    
        public Object newInstance(Callback[] var1) {
            CGLIB$SET_THREAD_CALLBACKS(var1);
            TestInterface$$EnhancerByCGLIB$$72f42620 var10000 = new TestInterface$$EnhancerByCGLIB$$72f42620();
            CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
            return var10000;
        }
    
        public Object newInstance(Callback var1) {
            CGLIB$SET_THREAD_CALLBACKS(new Callback[]{var1});
            TestInterface$$EnhancerByCGLIB$$72f42620 var10000 = new TestInterface$$EnhancerByCGLIB$$72f42620();
            CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
            return var10000;
        }
    
        public Object newInstance(Class[] var1, Object[] var2, Callback[] var3) {
            CGLIB$SET_THREAD_CALLBACKS(var3);
            TestInterface$$EnhancerByCGLIB$$72f42620 var10000 = new TestInterface$$EnhancerByCGLIB$$72f42620;
            switch(var1.length) {
            case 0:
                var10000.<init>();
                CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
                return var10000;
            default:
                throw new IllegalArgumentException("Constructor not found");
            }
        }
    
        public Callback getCallback(int var1) {
            CGLIB$BIND_CALLBACKS(this);
            MethodInterceptor var10000;
            switch(var1) {
            case 0:
                var10000 = this.CGLIB$CALLBACK_0;
                break;
            default:
                var10000 = null;
            }
    
            return var10000;
        }
    
        public void setCallback(int var1, Callback var2) {
            switch(var1) {
            case 0:
                this.CGLIB$CALLBACK_0 = (MethodInterceptor)var2;
            default:
            }
        }
    
        public Callback[] getCallbacks() {
            CGLIB$BIND_CALLBACKS(this);
            return new Callback[]{this.CGLIB$CALLBACK_0};
        }
    
        public void setCallbacks(Callback[] var1) {
            this.CGLIB$CALLBACK_0 = (MethodInterceptor)var1[0];
        }
    
        static {
            CGLIB$STATICHOOK1();
        }
    }
    
    

    cglib代理实现类

    1. 接口代码
    package com.tqy.document.reader.extention.demo2;
    
    /**
     * @author tengqingya
     * @create 2019-04-23 12:49
     */
    public interface TestInterface {
        String getHalloWorld();
    }
    
    1. 实现类代码
    package com.tqy.document.reader.extention.demo2;
    
    import static java.lang.System.out;
    
    /**
     * @author tengqingya
     * @create 2019-04-29 15:41
     */
    public class TestInterfaceImpl implements TestInterface {
        @Override
        public String getHalloWorld() {
            out.println("hello");
            return "hello";
        }
    }
    
    
    1. MethodInterceptor代码
    package com.tqy.document.reader.extention.demo2;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * @author tengqingya
     * @create 2019-04-23 12:49
     */
    
    public class TestCGLib implements MethodInterceptor {
    
        public Object getInstance(Class claxx) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(claxx);
            // 回调方法
            enhancer.setCallback(this);
            // 创建代理对象
            return enhancer.create();
        }
    
        @Override
        public Object intercept( Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            methodProxy.invokeSuper(o,objects);
            return method.getName();
        }
    }
    
    1. main函数
    package com.tqy.document.reader.extention.demo2;
    
    import net.sf.cglib.core.DebuggingClassWriter;
    
    /**
     * @author tengqingya
     * @create 2019-04-23 12:50
     */
    public class TestCGLibMain {
        public static void main(String[] args) {
            System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\gitCode\\mySpring\\DcumentReader\\src\\main\\java\\com\\tqy\\document\\reader\\extention\\demo2");
    
            TestCGLib testCGLib = new TestCGLib();
            TestInterface o = (TestInterface) testCGLib.getInstance(TestInterfaceImpl.class);
            System.out.println(o.getHalloWorld());
        }
    }
    
    
    1. 运行结果
    CGLIB debugging enabled, writing to 'D:\gitCode\mySpring\DcumentReader\src\main\java\com\tqy\document\reader\extention\demo2'
    hello
    getHalloWorld
    
    1. 生成的源码
    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by Fernflower decompiler)
    //
    
    package com.tqy.document.reader.extention.demo2;
    
    import java.lang.reflect.Method;
    import net.sf.cglib.core.ReflectUtils;
    import net.sf.cglib.core.Signature;
    import net.sf.cglib.proxy.Callback;
    import net.sf.cglib.proxy.Factory;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311 extends TestInterfaceImpl implements Factory {
        private boolean CGLIB$BOUND;
        private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
        private static final Callback[] CGLIB$STATIC_CALLBACKS;
        private MethodInterceptor CGLIB$CALLBACK_0;
        private static final Method CGLIB$getHalloWorld$0$Method;
        private static final MethodProxy CGLIB$getHalloWorld$0$Proxy;
        private static final Object[] CGLIB$emptyArgs;
        private static final Method CGLIB$finalize$1$Method;
        private static final MethodProxy CGLIB$finalize$1$Proxy;
        private static final Method CGLIB$equals$2$Method;
        private static final MethodProxy CGLIB$equals$2$Proxy;
        private static final Method CGLIB$toString$3$Method;
        private static final MethodProxy CGLIB$toString$3$Proxy;
        private static final Method CGLIB$hashCode$4$Method;
        private static final MethodProxy CGLIB$hashCode$4$Proxy;
        private static final Method CGLIB$clone$5$Method;
        private static final MethodProxy CGLIB$clone$5$Proxy;
    
        static void CGLIB$STATICHOOK1() {
            CGLIB$THREAD_CALLBACKS = new ThreadLocal();
            CGLIB$emptyArgs = new Object[0];
            Class var0 = Class.forName("com.tqy.document.reader.extention.demo2.TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311");
            Class var1;
            Method[] var10000 = ReflectUtils.findMethods(new String[]{"finalize", "()V", "equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;"}, (var1 = Class.forName("java.lang.Object")).getDeclaredMethods());
            CGLIB$finalize$1$Method = var10000[0];
            CGLIB$finalize$1$Proxy = MethodProxy.create(var1, var0, "()V", "finalize", "CGLIB$finalize$1");
            CGLIB$equals$2$Method = var10000[1];
            CGLIB$equals$2$Proxy = MethodProxy.create(var1, var0, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$2");
            CGLIB$toString$3$Method = var10000[2];
            CGLIB$toString$3$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "toString", "CGLIB$toString$3");
            CGLIB$hashCode$4$Method = var10000[3];
            CGLIB$hashCode$4$Proxy = MethodProxy.create(var1, var0, "()I", "hashCode", "CGLIB$hashCode$4");
            CGLIB$clone$5$Method = var10000[4];
            CGLIB$clone$5$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/Object;", "clone", "CGLIB$clone$5");
            CGLIB$getHalloWorld$0$Method = ReflectUtils.findMethods(new String[]{"getHalloWorld", "()Ljava/lang/String;"}, (var1 = Class.forName("com.tqy.document.reader.extention.demo2.TestInterfaceImpl")).getDeclaredMethods())[0];
            CGLIB$getHalloWorld$0$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "getHalloWorld", "CGLIB$getHalloWorld$0");
        }
    
        final String CGLIB$getHalloWorld$0() {
            return super.getHalloWorld();
        }
    
        public final String getHalloWorld() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            return var10000 != null ? (String)var10000.intercept(this, CGLIB$getHalloWorld$0$Method, CGLIB$emptyArgs, CGLIB$getHalloWorld$0$Proxy) : super.getHalloWorld();
        }
    
        final void CGLIB$finalize$1() throws Throwable {
            super.finalize();
        }
    
        protected final void finalize() throws Throwable {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                var10000.intercept(this, CGLIB$finalize$1$Method, CGLIB$emptyArgs, CGLIB$finalize$1$Proxy);
            } else {
                super.finalize();
            }
        }
    
        final boolean CGLIB$equals$2(Object var1) {
            return super.equals(var1);
        }
    
        public final boolean equals(Object var1) {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                Object var2 = var10000.intercept(this, CGLIB$equals$2$Method, new Object[]{var1}, CGLIB$equals$2$Proxy);
                return var2 == null ? false : (Boolean)var2;
            } else {
                return super.equals(var1);
            }
        }
    
        final String CGLIB$toString$3() {
            return super.toString();
        }
    
        public final String toString() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            return var10000 != null ? (String)var10000.intercept(this, CGLIB$toString$3$Method, CGLIB$emptyArgs, CGLIB$toString$3$Proxy) : super.toString();
        }
    
        final int CGLIB$hashCode$4() {
            return super.hashCode();
        }
    
        public final int hashCode() {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            if (var10000 != null) {
                Object var1 = var10000.intercept(this, CGLIB$hashCode$4$Method, CGLIB$emptyArgs, CGLIB$hashCode$4$Proxy);
                return var1 == null ? 0 : ((Number)var1).intValue();
            } else {
                return super.hashCode();
            }
        }
    
        final Object CGLIB$clone$5() throws CloneNotSupportedException {
            return super.clone();
        }
    
        protected final Object clone() throws CloneNotSupportedException {
            MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
            if (this.CGLIB$CALLBACK_0 == null) {
                CGLIB$BIND_CALLBACKS(this);
                var10000 = this.CGLIB$CALLBACK_0;
            }
    
            return var10000 != null ? var10000.intercept(this, CGLIB$clone$5$Method, CGLIB$emptyArgs, CGLIB$clone$5$Proxy) : super.clone();
        }
    
        public static MethodProxy CGLIB$findMethodProxy(Signature var0) {
            String var10000 = var0.toString();
            switch(var10000.hashCode()) {
            case -1662339427:
                if (var10000.equals("getHalloWorld()Ljava/lang/String;")) {
                    return CGLIB$getHalloWorld$0$Proxy;
                }
                break;
            case -1574182249:
                if (var10000.equals("finalize()V")) {
                    return CGLIB$finalize$1$Proxy;
                }
                break;
            case -508378822:
                if (var10000.equals("clone()Ljava/lang/Object;")) {
                    return CGLIB$clone$5$Proxy;
                }
                break;
            case 1826985398:
                if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
                    return CGLIB$equals$2$Proxy;
                }
                break;
            case 1913648695:
                if (var10000.equals("toString()Ljava/lang/String;")) {
                    return CGLIB$toString$3$Proxy;
                }
                break;
            case 1984935277:
                if (var10000.equals("hashCode()I")) {
                    return CGLIB$hashCode$4$Proxy;
                }
            }
    
            return null;
        }
    
        public TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311() {
            CGLIB$BIND_CALLBACKS(this);
        }
    
        public static void CGLIB$SET_THREAD_CALLBACKS(Callback[] var0) {
            CGLIB$THREAD_CALLBACKS.set(var0);
        }
    
        public static void CGLIB$SET_STATIC_CALLBACKS(Callback[] var0) {
            CGLIB$STATIC_CALLBACKS = var0;
        }
    
        private static final void CGLIB$BIND_CALLBACKS(Object var0) {
            TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311 var1 = (TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311)var0;
            if (!var1.CGLIB$BOUND) {
                var1.CGLIB$BOUND = true;
                Object var10000 = CGLIB$THREAD_CALLBACKS.get();
                if (var10000 == null) {
                    var10000 = CGLIB$STATIC_CALLBACKS;
                    if (CGLIB$STATIC_CALLBACKS == null) {
                        return;
                    }
                }
    
                var1.CGLIB$CALLBACK_0 = (MethodInterceptor)((Callback[])var10000)[0];
            }
    
        }
    
        public Object newInstance(Callback[] var1) {
            CGLIB$SET_THREAD_CALLBACKS(var1);
            TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311 var10000 = new TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311();
            CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
            return var10000;
        }
    
        public Object newInstance(Callback var1) {
            CGLIB$SET_THREAD_CALLBACKS(new Callback[]{var1});
            TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311 var10000 = new TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311();
            CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
            return var10000;
        }
    
        public Object newInstance(Class[] var1, Object[] var2, Callback[] var3) {
            CGLIB$SET_THREAD_CALLBACKS(var3);
            TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311 var10000 = new TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311;
            switch(var1.length) {
            case 0:
                var10000.<init>();
                CGLIB$SET_THREAD_CALLBACKS((Callback[])null);
                return var10000;
            default:
                throw new IllegalArgumentException("Constructor not found");
            }
        }
    
        public Callback getCallback(int var1) {
            CGLIB$BIND_CALLBACKS(this);
            MethodInterceptor var10000;
            switch(var1) {
            case 0:
                var10000 = this.CGLIB$CALLBACK_0;
                break;
            default:
                var10000 = null;
            }
    
            return var10000;
        }
    
        public void setCallback(int var1, Callback var2) {
            switch(var1) {
            case 0:
                this.CGLIB$CALLBACK_0 = (MethodInterceptor)var2;
            default:
            }
        }
    
        public Callback[] getCallbacks() {
            CGLIB$BIND_CALLBACKS(this);
            return new Callback[]{this.CGLIB$CALLBACK_0};
        }
    
        public void setCallbacks(Callback[] var1) {
            this.CGLIB$CALLBACK_0 = (MethodInterceptor)var1[0];
        }
    
        static {
            CGLIB$STATICHOOK1();
        }
    }
    
    

    对比源码

    public class TestInterface$$EnhancerByCGLIB$$72f42620 implements TestInterface, Factory
    
    public class TestInterfaceImpl$$EnhancerByCGLIB$$6ad87311 extends TestInterfaceImpl implements Factory
    

    可知

    对接口进行代理的cglib,最后生成的源码是实现了该接口和Factory接口
    对实现类进行代理的cglib,最后生成的源码是继承了实现类并实现了Factory接口
    

    版权所有

    版权所有:tengqingya 转载请注明出处

    展开全文
  • cglib动态代理具体代码演示如下: 第一步:创建业务目标类 package com . bjpowernode . service ; //目标类 public class SomeServiceImpl { public String doSome ( ) { System . out . ...

    动态代理功能就是实现业务代码与非业务代码实现解耦合的。
    在这里插入图片描述
    cglib动态代理具体代码演示如下:

    第一步:创建业务目标类

    package com.bjpowernode.service;
    
    //目标类
    public class SomeServiceImpl {
    
    	public String doSome(){
    		System.out.println("执行了业务方法doSome");
    		return "abcd";
    	}
    }
    
    

    第二步:创建方法拦截器类:实现功能增强

    package com.bjpowernode.proxy;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    //方法拦截器类, 实现功能的增强
    public class MyInterceptor implements MethodInterceptor {
    
    	private Object target;
    	
    	
    	public MyInterceptor(Object target) {
    		super();
    		this.target = target;
    	}
    
    
    	public MyInterceptor() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    
    	/**
    	 * intercept()等同于jdk中invoke()
    	 * 作用:拦截用户的请求, 调用业务方法的时候,首先执行intercept
    	 * 
    	 * 参数:
    	 *  Object obj:系统生成的代理对象
    	 *  Method method:正在执行的业务方法(目标方法)
    	 *  Object[] args:目标方法的参数列表
    	 *  MethodProxy proxy:目标方法的代理对象
    	 *  
    	 *  返回
    	 *   Object:目标方法的执行结果(可以是修改后的结果)
    	 */
    	@Override
    	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    		System.out.println("==========intercept==========");
    		Object result = null;
    		//调用目标方法
    		result  = method.invoke(target, args); //doSome()
    		
    		//修改result的结果
    		if( result != null){
    			//实现小写转大写
    			String str = (String)result;
    			result  = str.toUpperCase();
    		}
    		//返回目标方法的执行结果
    		return result;
    	}
    
    	
    
    }
    
    

    第三步:创建代理对象

    package com.bjpowernode.proxy;
    
    import com.bjpowernode.service.SomeServiceImpl;
    
    import net.sf.cglib.proxy.Enhancer;
    
    public class ProxyFactory {
    
    	//定义工具方法,创建代理对象
    	public Object createProxy(Object target){
    		//1.创建cglib中的Enhancer对象
    		Enhancer en  = new Enhancer();
    		//2.指定目标类对象
    		en.setSuperclass(SomeServiceImpl.class);
    		//3.指定方法拦截器对象
    		en.setCallback(new MyInterceptor(target));
    		//4.创建代理对象
    		return en.create();
    	}
    }
    
    

    第四步:编写测试方法,测试

    package com.bjpowernode.test;
    
    import com.bjpowernode.proxy.ProxyFactory;
    import com.bjpowernode.service.SomeServiceImpl;
    
    public class MyTest {
    
    	public static void main(String[] args) {
    		//创建目标对象
    		SomeServiceImpl target = new SomeServiceImpl();
    		//创建工具类对象
    		ProxyFactory factory = new ProxyFactory();
    		//调用工具方法
    		SomeServiceImpl proxy  = (SomeServiceImpl) factory.createProxy(target);
    		System.out.println("proxy:"+proxy.getClass().getName());
    		//通过代理对象执行业务方法
    		String str = proxy.doSome();
    		System.out.println("通过代理对象执行业务方法的结果:"+str);
    	}
    
    }
    
    
                           jdk动态代理具体代码演示:
    

    第一步:定义业务接口与实现类以及非业务工具类

    package com.bjpowernode.service;
    
    public interface SomeService {
    
    	void doSome();
    	void doOther();
    }
    package com.bjpowernode.service;
    
    import com.bjpowernode.utils.ServiceTools;
    
    public class SomeServiceImpl implements SomeService {
    
    	//业务功能和非业务功能的耦合
    	@Override
    	public void doSome() {
    		//ServiceTools.doLog();
    		System.out.println("执行了业务方法doSome");
    		//ServiceTools.doTrans();
    	}
    
    	@Override
    	public void doOther() {
    		//ServiceTools.doLog();
    		System.out.println("执行了业务方法doOther");
    		//ServiceTools.doTrans();
    	}
    	
    	//public void com.bjpowernode.service.SomeServiceImpl.doSome() throws Exception
    	
    	//execution(* com.xyz.service..*.*(..))
    	//com.xyz.service.impl.OtherService
    	//com.xyz.service.SomeService
    	
        //execution(* *..service.*.*(..))
    	// com.service.OtherService
    	// cn.service.SomeService
    	// org.cn.service.FirstService
    }
    
    
    package com.bjpowernode.utils;
    
    public class ServiceTools {
    
    	public static void doLog(){
    		System.out.println("非业务功能,打印日志");
    	}
    	
    	public static void doTrans(){
    		System.out.println("非业务功能,事务处理");
    	}
    }
    
    
    

    第二步:创建处理器类,实现InvocationHandler接口

    package com.bjpowernode.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    import com.bjpowernode.utils.ServiceTools;
    
    //使用jdk动态代理   处理器对象 
    public class MyInvocationHanlder implements InvocationHandler {
    
    	private Object target;
    	
    	
    	public MyInvocationHanlder(Object target) {
    		super();
    		this.target = target;
    	}
    
    
    	public MyInvocationHanlder() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    
    	/**
    	 * invoke:能截取对目标方法的访问,调用
    	 * 参数:
    	 *  Object proxy:系统生成的代理对象
    	 *  Method method:目标方法,业务方法
    	 *  Object[] args:目标方法的参数列表
    	 * 返回
    	 *  Object:目标方法的执行结果(可以是修改后的结果)
    	 */
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		Object result = null;
    		
    		String methodName  = method.getName();
    		System.out.println("methodName:"+methodName);
    		
    		if("doSome".equals(methodName)){
    			//在目标方法执行开始,加入日志
    			ServiceTools.doLog();
    			//目标方法的调用
    			result = method.invoke(target, args); //doSome
    			//在目标方法执行之后,提交事务
    			ServiceTools.doTrans();
    		} else {
    			// doOther()
    			//目标方法的调用
    			result = method.invoke(target, args); //doOther
    		}
    		
    		
    		//返回目标方法的执行结果
    		return result;
    	}
    
    }
    
    

    第三步:编写测试类,测试效果

    package com.bjpowernode.test;
    
    import java.lang.reflect.Proxy;
    
    import com.bjpowernode.proxy.MyInvocationHanlder;
    import com.bjpowernode.service.SomeService;
    import com.bjpowernode.service.SomeServiceImpl;
    
    public class MyTest {
    
    	public static void main(String[] args) {
    		//创建目标对象
    		SomeService target = new SomeServiceImpl();
    		//创建调用处理器对象
    		MyInvocationHanlder handler = new MyInvocationHanlder(target);
    		//创建代理对象
    		SomeService proxy  = (SomeService) Proxy.newProxyInstance(
    				target.getClass().getClassLoader(),
    				target.getClass().getInterfaces(), 
    				handler);
    		//通过代理对象,执行业务方法,实现日志,事务的增强
    		System.out.println("proxy:"+proxy.getClass().getName());
    		proxy.doSome();
    		System.out.println("==================");
    		proxy.doOther();
    	}
    
    }
    
    

    在这里插入图片描述

    展开全文
  • Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现。 JDK动态代理 JDK的动态代理,就是在程序运行的过程中,根据被代理接口来动态生成代理类的class文件,并加载运行...

    欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。

    Spring Aop是什么

    简单来说就是面向切面编程。Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现。

    JDK动态代理

    JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。代理的目的是调用目标方法时可以转而执行InvocationHandler的invoke方法,实际上spring aop也是在这里做文章。这也是典型的代理模式
    下面简单代码说明这个问题

    • 实现自己的InvocationHandler
    public class AopProxy implements InvocationHandler {
    
        private Object realObject;
    
        public AopProxy(Object realObject) {
            super();
            this.realObject = realObject;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("do something before execute invoke method...");
            Object invokeResult= method.invoke(realObject, args);
            System.out.println("do something after execute invoke method...");
            return invokeResult;
        }
    
    }
    
    • 制定接口以及其实现类
    public interface SubObject {
        public String execute(String... param);
    }
    
    public class RealObject implements SubObject {
    
        @Override
        public String execute(String... param) {
            for (int i = 0; i < param.length; i++) {
                System.out.println(param[i]);
            }
            return "execute method";
        }
    
    }
    
    • 测试动态代理
    public class AppMain {
        public static void main(String[] args) {
            SubObject realObject = new RealObject();
            AopProxy aopProxy = new AopProxy(realObject);
            // 通过jdk提供的proxy生成代理
            SubObject subObject = (SubObject) Proxy.newProxyInstance(aopProxy.getClass().getClassLoader(),
                    realObject.getClass().getInterfaces(), aopProxy);
            System.out.println(subObject.getClass().getName());
            System.out.println(subObject instanceof Proxy);
            String result =  subObject.execute("参数一","参数二");
            System.out.println(result);
        }
    }
    
    • 输出结果
    com.sun.proxy.$Proxy0
    true
    do something before execute invoke method...
    参数一
    参数二
    do something after execute invoke method...
    execute method
    

    着重说明一下:看到com.sun.proxy.$Proxy0是jdk动态生成的代理类,subObject instanceof Proxy打印为ture说明这个代理类继承了Proxy。

    这里遇到一个疑问:为什么jdk动态代理必须基于接口?

    原因如下:

    • 生成的代理类继承了Proxy,由于java是单继承,所以只能实现接口,通过接口实现
    • 从代理模式的设计来说,充分利用了java的多态特性,也符合基于接口编码的规范

    当然,jdk在生成代理的参数中也说明了,需要传入对应接口

    public static Object newProxyInstance(ClassLoader loader,
                                              Class<?>[] interfaces,
                                              InvocationHandler h)
            throws IllegalArgumentException
    

    CGLIB代理

    CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。
    CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

    如果目标对象没有实现接口,则默认会采用CGLIB代理;
    如果目标对象实现了接口,可以强制使用CGLIB实现代理。

    添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
    
    展开全文
  • 动态代理不通过接口CGLIB动态代理

    千次阅读 2015-04-24 09:31:25
    Java的jdk我们实现动态代理提供了invocationHandler接口,被代理的类必须实现相同的接口。但是很多时候我们拿到的类并没有这样的接口。那么这个时候要实现动态代理就要用到另外一种机制。那就是通过CGLIB来实现...

    Java的jdk为我们实现动态代理提供了invocationHandler接口,被代理的类必须实现相同的接口。但是很多时候我们拿到的类并没有这样的接口。那么这个时候要实现动态代理就要用到另外一种机制。那就是通过CGLIB来实现动态代理。下面就来看一个最简单的小例子。

    首先,简单介绍一下CGLIB实现动态代理的原理。CGLIB通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用。由于是创建的子类,所以就免去了接口的实现,但是这样做也有一些缺陷,对于final修饰的方法无法进行代理。

    因为我们要使用CGLIB所以必须先导入相应的包。在这里需要导入cglib.jar以及asm.jar两个包。这两个包随便在网上都能下载。至于怎样导入百度一下有教程,选中工程右键–>Build Path–>Add External Archivels。(注意:以上两个包一定要配套,否则有可能工程会无法正常运行)

    下面就正式开始我们的代码编写了。首先我们写一个类,实现一个方法(这里就不再有接口了),在这个方法里面打印一些文字。

    public class Helllo {
        public void fun()
        {
            System.out.println("In Hello doing fun()...");
        }
    
    }

    然后,实现代理类。CGLIB为我们提供了MethodInterceptor接口。创建CGLIBProxy类实现上面的接口,重写intercept()方法,在这里面对调用方法进行拦截。在这个类里还需要创建一个方法用来返回被代理类子类对象。在这里我创建了creatObject()方法

    public class CGLIBProxy implements MethodInterceptor{
    
        private Object obj;
    
        public Object createObject(Object target)
        {
            this.obj = target;
            //加载需要创建子类的类
            Enhancer hancer = new Enhancer();
            hancer.setSuperclass(this.obj.getClass());//设置代理目标
            hancer.setCallback(this);//设置回调
            hancer.setClassLoader(target.getClass().getClassLoader());
            return hancer.create();//返回子类对象
        }
    
        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2,
                MethodProxy arg3) throws Throwable {
            Object result = null;
            System.out.println("Before....");//调用方法前
            result = arg3.invokeSuper(arg0, arg2);
            System.out.println("After....");//调用方法后
    
    
            return result;
        }
    
    }

    最后,创建一个测试类。

    public class CGLIBMain {
        public static void main(String[] args)
        {
            HelloWord hello = new HelloWord();
            CGLIBProxy proxy = new CGLIBProxy();
            HelloWord helloword = (HelloWord) proxy.createObject(hello);
            helloword.sayHello();
        }
    
    }

    输出结果:

    Before...
    In Hello doing fun()...
    After...
    展开全文
  • CGLib方式对接口实现代理

    千次阅读 2017-07-26 14:57:00
    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术一个类创建子类,并在子类中采用方法拦截的...
  • Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。
  • 使用CGLib代理无实现类的接口

    千次阅读 2017-04-05 14:31:13
    在使用cxf时,发现给一个接口在配置文件中配置一下,不需要实现类就可以直接调用,仔细研究了一下CGLib,分享一下心得。CGLib代理的原理是通过二进制流生成一个动态class,该class继承被代理类以实现动态代理。那么...
  • 接口CGLIB动态代理实现

    千次阅读 2017-03-31 17:05:00
    接口CGLIB动态代理实现定义接口package com.hk.service; /** * 定义一个接口(一类人要做的事情) * @author 浪丶荡 * */ public interface ISomeService { //打官司 public String Litigate(); //吃饭 ...
  • 如下面调试图使用的是实现接口的,第三张调试图bean是CGLIB 工程环境是springframework 4.3.18 aspectjrt和aspectjweaver都是1.7.3 jdk1.8 applicationContext.xml里面有装配 <!-- 启用 aspectj 方式 AOP--> ...
  • 一.JDK的动态代理为什么必须要使用接口 JDK的代理Proxy必须要使用接口,才可以实现对方法的拦截。为什么呢?先让我们看一个JDK动态代理的示例: 接口类: public interface IPerson {  public void sayHi...
  • * 主业务接口:本接口中的方法将会被代理增强 * @author WanAkiko * */ public interface ISomeService { String doFirst(); void doSecond(); } 主业务接口实现类: import service.ISomeService; /**...
  • Java的动态代理,包括JDK自带的和cglib所集成的。
  • cglib代理

    2019-07-12 18:48:31
    而JDK动态代理有一定的局限性,因为使用JDK动态代理时,被代理类必须实现接口,然后动态代理生成的代理类同时实现该接口实现代理模式,但在特定情况下没办法让被代理类实现接口,那么此时我们就需要使用cglib代理。...
  • cglib创建代理类.rar

    2019-01-17 16:59:50
    springAOP等框架中,大量用到代理技术; 两类代理技术: 1,java动态代理,见JDK文档或相关java书;...2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单
  • JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的,...使用CGLib实现动态代理,完全代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用...
  • CGLIB动态代理jar包

    2018-05-21 14:36:20
    JDK动态代理必须提供接口才能使用,在一些能提供接口的环境中,只能采用其他第三方技术,比如CGLIB动态代理,这里提供CGLIB动态代理的相关jar包,供学习和测试使用。
  • cglib代理模式:被代理类无需继承接口; 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即...
  • 文章目录什么是代理为什么使用代理跨网络调用对象保证类的功能的单一性原则如何实现代理静态代理1. 基于继承的代理2. 基于接口代理动态代理1. JDK动态代理2. cglib动态代理实现 什么是代理    &...
  • CGLIB 动态代理

    2021-11-21 22:07:11
    JDK 动态代理必须提供接口才能使用,在一些能提供接口的环境中,只能采用其他第三方技术, 比如 CGLIB 动态代理。它的优势在于不需要提供接口,只要一个非抽象类就能实现动态代理
  • Java动态代理CGlib Jar包

    2017-12-08 18:16:34
    CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理
  • JDK动态代理不需要任何外部依赖,但是只能基于接口进行代理CGLIB通过继承的方式进行代理,无论目标对象有没有实现接口都可以代理,但是无法代理final对象与final方法。(final类型能有子类,final方法能被重载...
  • 附件java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
  • 1.1 CGLIB代理相关的类 1.2 CGLIB动态代理的基本原理 1.3 使用MethodInterceptor接口实现方法回调 1.3.1 实现MethodInterceptor接口 1.4 使用CGLIB代理最核心类Enhancer生成代理对象 1.5 使用CGLIB继进行动态...
  • Java两种动态代理JDK动态代理CGLIB动态代理

    万次阅读 多人点赞 2018-08-07 15:33:35
    cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式。为了对外开放协议,B往往实现了一个接口,A也会去实现接口。但是B是“真正”实现...
  • JDK代理和CGLIB代理的区别 区别 JDK: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGKIB: cglib动态代理是利用asm开源包,对代理对象类的class文件加载...
  • 而当代理对象没有接口时,默认选择的是CGLib代理来实现。 目标对象有接口 目标对象无接口 目标对象有接口设置CGLib动态代理<!-- 手动设置代理模式(含接口默认JDK动态代理,改CGLib动态代理) --> ...
  • jdk动态代理--利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。(基于接口) cglib动态代理--利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来...
  • 通过动态代理,给普通的对象生成代理对象,对其中的方法进行前置和后置的处理 例如spring的事务 使用动态代理的五大步骤 1.通过实现InvocationHandler接口来自定义自己的InvocationHandler; 2.通过Proxy....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,754
精华内容 24,301
关键字:

为什么cglib代理不需要接口