欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现两种动态代理JDK与CGLIB

程序员文章站 2022-03-26 22:25:12
1. 作用AOP的拦截功能是由java中的动态代理来实现的。在目标类的基础上增加切面逻辑,生成增强的目标类。jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。2. 分类JDK动态代理。CGLIB动态代理。3. 编码实现3.1 JDK接口public interface Target{ public void sava(String name);}public class TargetImpl implements T...

1. 作用

  • AOP的拦截功能是由java中的动态代理来实现的。在目标类的基础上增加切面逻辑,生成增强的目标类。
  • jdk动态代理是由java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。

2. 分类

  • JDK动态代理。
  • CGLIB动态代理。

3. 编码实现

3.1 JDK

  • 接口
public interface Target
{
    public void sava(String name);
}
public class TargetImpl implements Target
{
    public void sava(String name)
    {
        System.out.println("save " + name + " success");
    }
}
public class Log
{
    public void before()
    {
        System.out.println("开始记录日志...");
    }

    public void after()
    {
        System.out.println("日志记录完毕...");
    }
}
public class Main
{
    public static void main(final String[] args)
    {
        final TargetImpl target = new TargetImpl();
        final Log log = new Log();
        Target proxy = (Target) java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                new InvocationHandler()
                {
                    public Object invoke(Object o, Method method, Object[] args) throws Throwable
                    {
                        log.before();
                        Object invoke = method.invoke(target, args);
                        log.after();
                        return invoke;
                    }
                }
        );
        proxy.sava("cloud");

    }
}

3.2 CGLIB

public class Target
{
    public void login(String name)
    {
        System.out.println("Hello " + name);
    }
}
public class Log
{
    public void before()
    {
        System.out.println("开始记录日志...");
    }

    public void after()
    {
        System.out.println("日志记录完毕...");
    }
}
public class Main
{
    public static void main(String[] args)
    {
        // 1. 目标对象
        final Target target = new Target();

        // 2. 增强对象
        final Log log = new Log();

        // 3. 创建增强器
        Enhancer enhancer = new Enhancer();

        // 4. 设置父类
        enhancer.setSuperclass(Target.class);

        // 5. 设置回调
        enhancer.setCallback(new MethodInterceptor()
        {
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
            {
                log.before();
                Object invoke = method.invoke(target, args);
                log.after();
                return invoke;
            }
        });

        // 6. 创建代理对象
        Target proxy = (Target) enhancer.create();
        proxy.login("cloud");
    }
}

4. 总结

JDK动态代理有一定局限性, 代理类和目标类都必须实现同一个接口。而CGLIB则没有这种局限性, CGLIB是让代理类继承目标类。

本文地址:https://blog.csdn.net/ZY4444444/article/details/109563890