The difference between Proxy and CGLIB

本文介绍JAVA中使用JDK Proxy和CGLIB实现动态代理的方法,包括定义接口与类、设置回调类、创建动态代理工厂及单元测试等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA实现动态代理常用的有两种方式:

1, java.lang.reflect.Proxy (JDK)

2, net.sf.cglib.proxy.Enhancer(cglib)

两者之间的区别如图1-1 所示。

                                                            图1-1 jdk 和 cglib 概要图

jdk和cglib实现动态代理的原理是完全不同的,jdk是通过目标class所实现的接口,而cglib是通过目标对象的子类完成的。

他们二者互相补充,基本上能够满足所有的动态代理需求。


jdk和cglib实现动态代理的简单例子如下所示:


jdk:

****************************************************************************************************

1,定义接口

public interface SubInter {
    
    public abstract void display() ;
    
    public abstract void display2();

}


2, 定义实现类

public class SonObject implements SubInter {

    @Override
    public void display() {
        System.out.println("This is a realy object !");
    }

    @Override
    public void display2() {
        System.out.println("This is a test2!");
        
    }

}

3, 设置回调类

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

public class Dynamic implements InvocationHandler {

    private Object object;
    
    private String validateString;
    
    public Dynamic(Object object, String validateString) {
        this.object = object;
        this.validateString = validateString;
    }

    @Override
    public Object invoke(Object arg0, Method arg1, Object[] arg2)
            throws Throwable {
        boolean b = validateMehod(arg1.getName());
        Object object = null;
        if (b) {
            before();
            object = arg1.invoke(this.object, arg2);
            after();
        }else {
            object = arg1.invoke(this.object, arg2);
        }
        return object;
    }
    
    public boolean validateMehod(String methodName) {
        boolean b = false;
        String methodNames[] = validateString.split("&");
        for (String name : methodNames) {
            if (methodName.contains(name)) {
                b = true;
                return b;
            }
        }
        return b;
    }

    public void before() {
        System.out.println("Before");
    }

    public void after() {
        System.out.println("after");
    }

}

4, 动态代理工厂

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

/**
 *
 * @author gyf
 *
 *         We can get a proxy instance for the target object by the specify
 *         InvocationHandler.
 *
 */
public class DynamicProxyFactory {

    public static Object createProxyInstance(Object targetObject,
            InvocationHandler handler) {
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(), handler);
    }

}


5, 单元测试

public class Junit {
    
   @Test
    public void testJDK() {
        SubInter targetObject = new SonObject();
        InvocationHandler handler = new Dynamic(targetObject, "2&3");
        SubInter object = (SubInter)DynamicProxyFactory.createProxyInstance(targetObject, handler);
        object.display2();
    }

}

cglib

*************************************************************************************************

1, 定义目标类

public class TargetObject {
    
    public void display() {
        System.out.println("This is a test");
    }
    
    public void display2() {
        System.out.println("This is a test2");
    }

}


2, 定义回调类

import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibDynamic implements MethodInterceptor{
    
    private Object targetObject;
    
    public CglibDynamic(){}
    
    public CglibDynamic(Object object) {
        this.targetObject = object;
    }

    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2,
            MethodProxy arg3) throws Throwable {
        
        Object object = arg3.invoke(targetObject, arg2);
        
        return object;
    }

}

3, 定义动态代理工厂

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

public class CglibDynamicFactory {

    public static Object getProxyInstance(Object targetObject,
            MethodInterceptor methodInterceptor) {
        
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetObject.getClass());
        enhancer.setCallback(methodInterceptor);
        
        return enhancer.create();
    }

}


4, 单元测试

import net.sf.cglib.proxy.MethodInterceptor;

import org.junit.Test;

import com.cglib.proxy.CglibDynamic;
import com.cglib.proxy.CglibDynamicFactory;
import com.cglib.proxy.TargetObject;

public class Junit {
    
    @Test
    public void testCglib() {
        TargetObject object = new TargetObject();
        MethodInterceptor interceptor = new CglibDynamic(object);
        
        TargetObject son = (TargetObject)CglibDynamicFactory.getProxyInstance(object, interceptor);
        son.display();
    }

}


当然Hibernate现在采用了javasist来取代cglib, 有关javasist我会继续学习。



资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值