动态代理与cglib

Posted ?一叶之秋?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理与cglib相关的知识,希望对你有一定的参考价值。

  代理分为静态代理,jdk动态代理和cglib

  1、首先,说一下静态代理。

    定义一个接口

  

public interface Interface{
    void doSomething();

    void doSomething(String arg);
}

  定义一个被代理类,并实现接口

   

public class RealInterface implements Interface {

    @Override
    public void doSomething() {
        System.out.println("doSomething");
    }

    @Override
    public void doSomething(String arg) {
        System.out.println("doSomething " + arg);
    }


}

  定义一个代理类,并实现接口

  

public class SimpleProxy implements Interface {

    private Interface inter;

    public SimpleProxy(Interface inter) {
        this.inter = inter;
    }

    @Override
    public void doSomething() {
        System.out.println("proxy start");
        inter.doSomething();
    }

    @Override
    public void doSomething(String arg) {
        System.out.println("proxy else start");
        inter.doSomething(arg);
    }
}

  动态代理 ,动态代理需要实现InvocationHandler接口

  

public class DynamicProxy implements InvocationHandler {

    private Object anInterface;

    public DynamicProxy(Object anInterface) {
        this.anInterface = anInterface;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("dynamic proxy");
        return method.invoke(anInterface,args);
    }
}

  cglib,cglib不需要实现接口,通过继承被代理类来实现代理,类似于Spring AOP,由于是继承,不能代理final修饰的类

   首先,使用maven引入jar包,通过使用

Enhancer 来实现代理。

 

 <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.6</version>
        </dependency>

 

/**
 * 静态代理
 * 动态代理
 * cglib
 */
public class Main {

    public void doSomthing() {
        System.out.println("cglib doSomething");
    }

    public static void consumer(Interface inter) {
        inter.doSomething();
        inter.doSomething("play");
    }

    public static void main(String[] args) {
        /**
         * 静态代理
         */
        consumer(new RealInterface());
        consumer(new SimpleProxy(new RealInterface()));

        /**
         * 动态代理
         */
        Interface realInterface = new RealInterface();
        Interface anInterface = (Interface)Proxy.newProxyInstance(realInterface.getClass().getClassLoader(),  //Intergace.class.getClassLoader(),
                realInterface.getClass().getInterfaces(), //new class[] {Interface.class},
                new DynamicProxy(realInterface));
        consumer(anInterface);

        /**
         * cglib
         */
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Main.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("cdlib proxy");
                return methodProxy.invokeSuper(o,args);
            }
        });
        Main main = (Main)enhancer.create();
        main.doSomthing();
    }
}

 

以上是关于动态代理与cglib的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP JDK动态代理与CGLib动态代理区别

JDK动态代理与CGLIB动态代理

JDK动态代理与CGLIB动态代理

DK动态代理与CGLib动态代理的区别

JDK 动态代理与 CGLIB 动态代理,它俩真的不一样

JDK的动态代理与cglib动态代理