美文网首页程序员
Java动态代理技术

Java动态代理技术

作者: anseey | 来源:发表于2016-08-24 10:32 被阅读0次

Java动态代理技术广泛的应用于我们的项目之中,比如Spring AOP、分布式服务框架等。其主要实现方式有2种,一种是JDK动态代理,一种是cglib动态代理,两种方式各有优劣,本文在此做一个总结。

JDK动态代理

JDK自带的代理机制

实现原理:接口,反射。

运行时根据目标类动态创建代理类,代理类和目标类实现相同的接口。调用方调用代理类,代理类反射调用目标类。

JDK动态代理

优点:

  • 创建代理性能比cglib好
  • JDK自带,无需引用第三方包

缺点:

  • 需要依赖共同的接口,如果目标类没有实现接口,就无法代理。
  • 代理类执行速度较慢

创建代理流程

  1. 实现InvocationHandler接口,创建自己调用处理器,主要是实现invoke方法。invoke方法负责正真调用目标类的方法。
  2. 通Proxy.newProxyInstance()创建代理类,需要三个参数:目标类的ClassLoader、Interfaces和InvocationHandler。

实例

package com.javastudy.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author fangyi.xfy 2016/8/23 11:29.
 */
public class ProxyFactory implements InvocationHandler {

    /**
     * 目标对象
     */
    private Object target;

    /**
     * 创建代理类
     **/
    public Object newProxyInstance(Object target){
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    /**
     * 重写调用方法,此处可以织入代码,比如AOP切面
     **/
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before invoke");
        Object res = method.invoke(target, args);
        System.out.println("after invoke");
        return res;
    }

    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        ProxyFactory proxyFactory = new ProxyFactory();
        UserService proxy = (UserService) proxyFactory.newProxyInstance(userService);
        proxy.addUser("Andy");
    }
}

参考:
Java JDK 动态代理使用及实现原理分析

cglib动态代理

cglib - Byte Code Generation Library is high level API to generate and transform Java byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access. https://github.com/cglib/cglib/wiki

实现原理:继承,反射。

运行时根据目标类动态创建代理类,代理类是目标类的子类。

优点:

  • 执行性能优于JDK动态代理
cglib动态代理

缺点:

  • 由于是继承,无法对final修饰的class代理
  • 创建代理类性能较差

创建代理流程

  1. 实现MethodInterceptor接口,创建自己的方法拦截器,实现intercept方法。
  2. 通过Enhancer创建目标类的代理,需要目标类的class,MethodInterceptor。

实例

public class CglibProxy implements MethodInterceptor {
    private Enhancer enhancer = new Enhancer();

    public Object getProxy(Class clazz) {
        //设置需要创建子类的类  
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        //通过字节码技术动态创建子类实例
        return enhancer.create();
    }

    //实现MethodInterceptor接口方法
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("前置代理");
        //通过代理类调用父类中的方法
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("后置代理");
        return result;
    }
}

参考:
cglib Tutorial
CGLib动态代理原理及实现

相关文章

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • Java动态代理

    1、什么是动态代理 动态代理利用Java的反射技术(Java Reflection)生成字节码,在运行时创建一个实...

  • JAVA动态代理

    Spring AOP功能最基本的技术要点为动态代理。当下Java主要有两种动态代理方式 基于接口的JDK动态代理 ...

  • 公共知识复习

    动态代理 公共技术点之 Java 动态代理 @codeKK 开源站 屏幕适配 android机型适配终极篇 - C...

  • Spring AOP

    本文主要是解析Spring AOP的运作流程。上次讲到Java中的两种动态代理技术:JDK动态代理和CGLIB动态...

  • JDK中实现动态代理技术

    Java中的动态代理技术可以动态的创建并且动态处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一...

  • Java代理模式之CGLIB动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 前面我们了解了JDK动态代理技术,发现其真实对象必...

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • Java动态代理技术

    Java动态代理技术广泛的应用于我们的项目之中,比如Spring AOP、分布式服务框架等。其主要实现方式有2种,...

网友评论

    本文标题:Java动态代理技术

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