码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理与cglib

时间:2018-05-17 00:59:32      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:depend   enc   class   div   eth   code   create   handle   star   

  代理分为静态代理,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

标签:depend   enc   class   div   eth   code   create   handle   star   

原文地址:https://www.cnblogs.com/sunjie-one/p/9048821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!