美文网首页
Java代理(jdk静态代理、动态代理和cglib动态代理)

Java代理(jdk静态代理、动态代理和cglib动态代理)

作者: shuangyueliao | 来源:发表于2019-11-07 23:02 被阅读0次

jdk静态代理

public interface AddService {
    Integer add(int a, int b);
}
public class AddServiceImpl implements AddService {
    @Override
    public Integer add(int a, int b) {
        return a + b;
    }
}
public class AddServiceProxy implements AddService{
    private AddService addService;

    public AddServiceProxy(AddService addService) {
        this.addService = addService;
    }

    public static void main(String[] args) {
        AddService addService = new AddServiceImpl();
        AddService addServiceProxy = new AddServiceProxy(addService);
        addServiceProxy.add(1, 3);
    }

    @Override
    public Integer add(int a, int b) {
        System.out.println("before");
        int result =  addService.add(a, b);
        System.out.println("result: " + result);
        System.out.println("after");
        return result;
    }
}

jdk动态代理

jdk动态代理的业务类必须实现接口

public interface AddService {
    Integer add(int a, int b);
}

业务类的实现类

public class AddServiceImpl implements AddService {
    @Override
    public Integer add(int a, int b) {
        return a + b;
    }
}

代理类的生成

public class AddServiceHandler implements InvocationHandler {
    private AddService addService;
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before");
        Object invoke = method.invoke(addService, args);
        System.out.println(invoke);
        System.out.println("after");
        return invoke;
    }

    public AddServiceHandler(AddService addService) {
        this.addService = addService;
    }

    public AddService getProxy() {
        return (AddService) Proxy.newProxyInstance(addService.getClass().getClassLoader(), addService.getClass().getInterfaces(), this);
    }

    public static void main(String[] args) {
        AddService service = new AddServiceImpl();
        AddServiceHandler addServiceHandler = new AddServiceHandler(service);
        AddService proxy = addServiceHandler.getProxy();
        proxy.add(1, 2);
    }
}

cglib动态代理

业务类不需要实现接口,但不能业务类需要继承,所以业务类不能是final及业务类的相应方法不能是final

public class AddServiceImpl {
    public Integer add(int a, int b) {
        return a + b;
    }
}
public class AddServiceCglib implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("result:" + result);
        System.out.println("after");
        return result;
    }

    public Object getInstance(Class clzz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clzz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public static void main(String[] args) {
        AddServiceCglib cglib = new AddServiceCglib();
        AddServiceImpl addServiceImpl = (AddServiceImpl) cglib.getInstance(AddServiceImpl.class);
        addServiceImpl.add(1,7);
    }
}

相关文章

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • java代理笔记:静态代理、JDK动态代理、CGlib动态代理

    1.静态代理 JDK动态代理 CGlib动态代理

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • 设计模式~代理模式

    学习代理模式内容: ★ 静态代理、 ★ 动态代理(JDK动态代理、CGLIB动态代理)、 ★ 拦截器的原理和日志记...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • java代理(proxy)

    静态代理 JDK 动态代理 CGLib 动态代理1)引入maven依赖 2)代码实现

  • Spring AOP中的动态代理

    Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理: (3)静态代理与动态代理区别...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

网友评论

      本文标题:Java代理(jdk静态代理、动态代理和cglib动态代理)

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