`
guzizai2007
  • 浏览: 359611 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

cglib代理

 
阅读更多

1、cglib是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。

2、代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包。

3、CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)。最流行的OR Mapping工具hibernate也使用CGLIB来代理单端single-ended(多对一和一对一)关联(对集合的延迟抓取,是采用其他机制实现的)。EasyMock和jMock是通过使用模仿(moke)对象来测试java代码的包。它们都通过使用CGLIB来为那些没有接口的类创建模仿(moke)对象。

4、CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的字节码。当然不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉

5、创建一个简单的代理类:

package com.sxit;

import java.lang.reflect.Method;

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

/**
 * @功能:
 * @作者:smile
 * @时间:2013-3-4 上午11:23:39
 * @版本: 1.0
 */
public class proxyUtil implements MethodInterceptor {
	
	private Object target;
	
	public proxyUtil(){}
	//通过构造函数传入需要代理的目标对象
	public proxyUtil(Object target){
		this.target = target;
	}
	
	//这里类似一个拦截器  在方法调用前后编制业务逻辑
	public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		
		System.out.println(method+"方法开始前...");
		//调用原来的方法
		Object o = proxy.invokeSuper(target, args);
		System.out.println(method+"方法结束了...");
		System.out.println("返回对象为:"+o);
		return o;
	}
	
}

 6、一个简单的接口和它的实现类: 

package com.sxit;

/**
 * @功能:
 * @作者:smile
 * @时间:2013-3-4 上午11:22:32
 * @版本: 1.0
 */
public interface Person {
	
	/**
	 * @功能:说话
	 */
	public String say(String name);
	/**
	 * @功能:看
	 */
	public String look(String name);
	
}
package com.sxit;

/**
 * @功能:
 * @作者:smile
 * @时间:2013-3-4 上午11:23:08
 * @版本: 1.0
 */
public class Chinese implements Person {

	public String say(String name) {
		System.out.println("打印>>>>>>你好:"+name);
		return "你好:"+name;
	}
	
	public String look(String name) {
		System.out.println("打印>>>>>>我看到:"+name);
		return "我看到:"+name;
	}

}

 7、创建代理:

package com.sxit;

import net.sf.cglib.proxy.Enhancer;

public class Test {

	public static void main(String[] args) {

		//需要被代理的目標對象
		Chinese c = new Chinese();
		Enhancer hancer = new Enhancer();
		//通过继承目标对象来实现代理  所以目标对象一定要有一个默认无参构造函数  反射的时候需要实例化父类对象
		hancer.setSuperclass(c.getClass());
		//设置代理回调函数
		hancer.setCallback(new proxyUtil(c));
		//代理后的对象
		Chinese c2 = (Chinese) hancer.create();

		c2.say("sb");
		c2.look("傻逼");
	}

}

 8、打印信息:

public java.lang.String com.sxit.Chinese.say(java.lang.String)方法开始前...
打印>>>>>>你好:sb
public java.lang.String com.sxit.Chinese.say(java.lang.String)方法结束了...
返回对象为:你好:sb
public java.lang.String com.sxit.Chinese.look(java.lang.String)方法开始前...
打印>>>>>>我看到:傻逼
public java.lang.String com.sxit.Chinese.look(java.lang.String)方法结束了...
返回对象为:我看到:傻逼

 9、CallbackFilter可以实现不同的方法使用不同的回调方法:

package com.sxit;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.CallbackFilter;

public class CallBackFilterImp implements CallbackFilter {
	
	//方法名过滤
	public int accept(Method method) {
		if(method.getName().equals("say")){
			return 0;
		}else if(method.getName().equals("look")){
			return 1;
		}
		return 0;
	}
}

 10、新写一个代理处理类proxyUtil2,只改动了打印信息:

package com.sxit;

import java.lang.reflect.Method;

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

/**
 * @功能:
 * @作者:smile
 * @时间:2013-3-4 上午11:23:39
 * @版本: 1.0
 */
public class proxyUtil2 implements MethodInterceptor {
	
	private Object target;
	
	public proxyUtil2(){}
	
	public proxyUtil2(Object target){
		this.target = target;
	}
	
	//这里类似一个拦截器  在方法调用前后编制业务逻辑
	public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		
		System.out.println(method+"方法啦啦啦开始啦...");
		//调用原来的方法
		Object o = proxy.invokeSuper(target, args);
		System.out.println(method+"方法啦啦啦结束啦...");
		System.out.println("返回对象为:"+o);
		return o;
	}
	
}

 11、测试:

package com.sxit;

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

public class Test {

	public static void main(String[] args) {

		// 需要被代理的目標對象
		Chinese c = new Chinese();
		Enhancer hancer = new Enhancer();
		// 通过继承目标对象来实现代理 所以目标对象一定要有一个默认无参构造函数 反射的时候需要实例化父类对象
		hancer.setSuperclass(c.getClass());
		// 一个回调函数数组
		Callback[] callbacks = new Callback[] { new proxyUtil(c), new proxyUtil2(c) };
		hancer.setCallbacks(callbacks);
		// 设置方法过滤器
		hancer.setCallbackFilter(new CallBackFilterImp());
		// 代理后的对象
		Chinese c2 = (Chinese) hancer.create();

		c2.say("sb");
		c2.look("傻逼");
	}

}

 12、打印信息:

public java.lang.String com.sxit.Chinese.say(java.lang.String)方法开始前...
打印>>>>>>你好:sb
public java.lang.String com.sxit.Chinese.say(java.lang.String)方法结束了...
返回对象为:你好:sb
public java.lang.String com.sxit.Chinese.look(java.lang.String)方法啦啦啦开始啦...
打印>>>>>>我看到:傻逼
public java.lang.String com.sxit.Chinese.look(java.lang.String)方法啦啦啦结束啦...
返回对象为:我看到:傻逼

 13、注意:

CallBackFilterImp中的return 0和return 1这里的值是指回调数组callbacks数组下表,0则对应proxyUtil这个代理类处理,1则对应proxyUtil2这个代理类处理。

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    交互修改.rp

    交互修改

    14230-2.pdf

    ISO14230-2标准文档,定义了K线通讯方式和数据格式,对于汽车诊断非常有用

    基于python的求职招聘网站 python+django+vue搭建的求职招聘管理系统 - 毕业设计 - 课程设计.zip

    学习作者过程中,遇到问题可以咨询解决方案前台地址http://job.gitapp.cn后台地址http://job.gitapp.cn/admin后台管理帐号用户名admin123 密码admin123功能介绍平台采用B/S结构,前端采用主流的Python语言进行开发,前端采用主流的V​​ue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括首页、岗位详情页、简历中心、用户设置模块。后台功能包括总览、岗位管理、公司管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。代码结构服务器目录编号web目录是前端代码部署运行执行步骤(1)安装python 3.8(2) 安装依赖。进入server目录下,执行 pip install -r requests.txt(3)安装mysql 5.7数据库,并创建数据库,创建SQL如下CREATE DATABASE IF NOT EXISTS xxx DEFAULT CHARSET utf8 COLLATE utf8_general_ci(4)恢复

    4602-职业规划设计书PPT护理.pptx

    4602-职业规划设计书PPT护理

    非常好的SqlServer查询性能优化教程资料100%好用.zip

    非常好的SqlServer查询性能优化教程资料100%好用.zip

    基于Springboot+Vue+Python深度神经网络学习算法水质管理预测系统设计毕业源码案例设计.zip

    基于Springboot+Vue+Python深度神经网络学习算法水质管理预测系统设计毕业源码案例设计Springboot_Vue_Python_水质管理_预测基于Springboot+Vue+Python深度神经网络学习算法水质管理预测系统设计毕业源码案例设计程序开发软件Eclipse/Idea + WebStorm/VsCode + Pycharm 数据库mysql 开发技术Springboot + Vue + Python 这个是一个水质管理和预报系统,它是一个全栈Web应用程序,使用机器学习和深度神经网络算法来预测未来的水质。系统一共有2个身份包括管理员和用户。管理员登录后可以查询最新水质检测数据,也可以上报新的水质数据,可以查询管理历史水质数据,查询历史水质趋势图,训练自己的模型参数,选择一个算法模型结果预测下个月的水质信息,管理所有的用户信息用户登录后比管理员就少了个用户管理功能。管理员账号密码 admin/123 用户账号密码user1/123

    微信小程序云开发毕业设计「单词天天斗」,好友,匹配,人机对战,单词本科毕设打字稿原创微信小程序.zip

    单词天天斗 (毕业设计/实战小程序/微信小程序完整项目)介绍该项目基于「微信小程序」原生框架和「微信小程序云开发」实现单词对战类小程序,支持好友对战、随机匹配、人机对战透明不同模式的「对战模式」另外提供「每日对战」词汇」、「生词本」、「排行榜」、「设置」等功能,实现完整的业务闭环。单词库包含从小学、初中、高中、四六级、考研、雅思等常需掌握的词汇,支持自定义词库,支持自定义拓展无限本单词书。技术栈主要为微信小程序、云开发、TypeScript等,从头搭建项目,基于git管理代码版本,使用eslint作为代码格式校验,并对页面进行组件化拆分,前端和云函数均采用TypeScript。实践小程序能力,如用户信息获取、用户登录、全局状态管理、路由、wxs、npm包、播放音频、回复、转发分享、动画、云数据库等。项目提供完整设计稿,项目演示可查看微信小程序「单词天天斗」,扫码体验 ↓这些人毕设参考项目文档齐全、题目合适、技术广度大、业务闭环,包含项目解析文档和教程,这是一个非常适合作为毕设学习的小程序项目。无化部署运营无论你是想通过小程序现变,还是想给自己的「英语课程教材」

    利用ReST与ReAct自改进多步骤推理的大规模语言模型代理

    内容概要:本文提出了结合强化自我训练(ReST)和响应动作链路(ReAct)的方法来构建并改善大规模语言模型代理的性能,尤其是在需要多步骤推理以解决复杂自然语言查询的任务上。文中定义了一个能够在外部工具/ API /环境交互中表现出色的代理,并提出了一种通过迭代训练以前的轨迹来进行连续自我提升和精炼的技术路径。 适合人群:对大型语言模型研究及应用有兴趣的研究人员和工程师。 使用场景及目标:本方法主要适用于处理需要多个信息检索步骤才能完成的问题解决任务,如基于复杂开放性问答系统的发展。具体目标是在减少所需参数量的前提下提高此类系统的准确性、鲁棒性和效率。 其他说明:作者展示了仅经过两轮迭代优化,即可以从一个大的预训练模型蒸馏出性能相当但大小减少两个数量级的小型化模型。此外,在整个过程中没有使用人类标记的数据进行直接监督。

    毕业设计Android,一款水果健康百科app.zip

    毕业设计Android,一款水果健康百科app斯戈利毕业设计Android,一款水果健康百科app

    移动互联网发展和岗位分析.pptx

    移动互联网发展和岗位分析.pptx

    数控加工程序设计.pptx

    数控加工程序设计.pptx

    毕业设计基于STM32的智能停车场设计.zip

    毕业设计基于STM32的智能停车场设计基于STM32的智能停车场设计项目介绍该项目为毕业设计。基于STM32F1平台的智能停车场,板卡划分为主板、控制台指示板及场内红外检测板,支持短信定时报告停车场状态与远程控制、进出场自动电梯停车杆并播报欢迎消息、检测车位和环境温湿度并在屏幕实时显示状态。目前阶段正在进行电路验证设计与打样阶段。预计2月上旬至中旬完成电路设计并进入编码阶段。目前功能概述车辆进场与退场时,语音播报相应的欢迎语句并自动升起停车杆。待车辆完全驶入停车场后,自动降下停车杆。通过红外方式检测车位停车状态,并在门口控制台和相应车位显示停车状态。屏幕显示当前可用车票和当前温湿度每1小时通过短信报告目前停车场车位情况、1小时内车辆进出数量。短信下发控制指令。后续阶段功能车辆停车计费功能。冲卡检测并自动报警功能。加入实时时钟,通过短信安排时间。用户使用场景功能列表模块 功能 商品分类STM32F103VET6 微型系统板 毕业设计使用的开发板 单片机F103VESIM800L模块 支持GPRS短信收发的功能 12864液晶屏

    基于SpringBoot+Vue.js的轻小说在线阅读网站前后端分离全部资料+详细文档.zip

    【资源说明】 基于SpringBoot+Vue.js的轻小说在线阅读网站前后端分离全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    “腾达”游戏分享网站的设计与实现_97c7a2s2.zip

    “腾达”游戏分享网站的设计与实现_97c7a2s2

    大数据与会计 (9).docx

    大数据与会计 (9)

    数学建模matlabppt课件市公开课一等奖百校联赛特等奖课件.pptx

    数学建模matlabppt课件市公开课一等奖百校联赛特等奖课件.pptx

    城市轨道交通通信信号技术_.docx

    城市轨道交通通信信号技术_

    【毕业设计+开题答辩】-基于JAVA_JSP电子书下载系统-【源代码+截图+数据库+论文+视频讲解】

    本文中的项目资源均整理自互联网,若侵犯了您的权益,请及时联系博主,博主会及时处理。 项目资源中使用的技术和系统用处不一定准确和全面,我只是大致的浏览了一下,具体使用技术建议参考代码和视频讲解。 资源中的各内容不一定每一个都非常的完美,可能会有少许错误,建议多看几个,选其中一个自己觉得不错的,用来做毕设或者开题等等。 资源中所列论文可以参考,但是不建议且强烈不建议直接照搬照抄,因为毕竟要查重,避免引起不必要的麻烦。

    压力表计算机软件及应用it计算机专业资料.pptx

    压力表计算机软件及应用it计算机专业资料.pptx

    钢材器材破损铁锈检测69-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    钢材器材破损铁锈检测69-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar钢重用-V4 2024-03-27 5:01 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括1094张图像。 钢元素以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为416x416(拉伸) 应用以下扩展来创建每个源图像的3个版本: *水平翻转的50%概率 *以下90度旋转之一的同等概率:无,顺时针,逆时针方向 * -15%至+15%之间的随机BRIGTHNESS调整 * 0到0.8像素之间的随机高斯模糊

Global site tag (gtag.js) - Google Analytics