当前位置: 首页 > news >正文

CGlib的动态代理使用示例

1、cglib简述

Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用,它的运行速度要远远快于JDK的Proxy动态代理:

使用CGLIB需要导入以下两个jar文件:

$1: asm.jar – CGLIB的底层实现

$2: cglib.jar – CGLIB的核心jar包。

CGLIB的核心类:

net.sf.cglib.proxy.Enhancer –主要的增强类

net.sf.cglib.proxy.MethodInterceptor –主要的方法拦截类,它是Callback接口的子接口,需要用户实现

net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:

Object o = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。

2、简单的cglib代理使用

前述:Person 类和Dog类都有一个方法叫做avtive(); Dog的avtive()方法来实现自IAnimal接口。

package com.boonya.proxy.cglib;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibObjectProxy {

	@SuppressWarnings("rawtypes")
	public static Object ceateProxtObject(final Object object,Class clazz) {
		// 声明增加类实例
		Enhancer en = new Enhancer();
		// 设置被代理类字节码,CGLIB根据字节码生成被代理类的子类
		en.setSuperclass(clazz);
		// 设置回调函数,即一个方法拦截
		en.setCallback(new MethodInterceptor() {

			@Override
			public Object intercept(Object arg0, Method method, Object[] args,
					MethodProxy arg3) throws Throwable {
				
				// 注意参数object,仍然为外部声明的源对象,且Method为JDK的Method反射
				Object o = method.invoke(object, args);

				return o;
			}
		});
		return en.create();
	}
	
	public static void main(String[] args) {
		// 未实现接口的类的代理
		Person proxyPerson=(Person) CglibObjectProxy.ceateProxtObject(new Person(),Person.class);
		proxyPerson.active("Talk with sb.");
		// 实现接口的类的代理
		IAnimal proxyDog=(IAnimal) CglibObjectProxy.ceateProxtObject(new Dog(),Dog.class);
		proxyDog.active("Dog lying ...........");
		
	}

}
3、优化封装cglib的使用对象

package com.boonya.proxy.cglib;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor {

	private Object srcTarget;

	private CglibProxy(Object o) {
		this.srcTarget = o;
	}

	@SuppressWarnings("unchecked")
	public static <T> T proxyTarget(T t) {
		Enhancer en = new Enhancer();
		en.setSuperclass(t.getClass());
		en.setCallback(new CglibProxy(t));
		T tt = (T) en.create();
		return tt;
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {

		Object o = method.invoke(srcTarget, args);
		return o;
	}

	public static void main(String[] args) {
		// 未实现接口的类的代理
		Person person = CglibProxy.proxyTarget(new Person());
		person.active("Tom speaking ........");
		// 实现接口的类的代理
		IAnimal dog = CglibProxy.proxyTarget(new Dog());
		dog.active("Dog is running.........");
	}

}

参考地址: http://www.open-open.com/lib/view/open1335662371030.html

相关文章:

  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4)事件处理——(7)简单事件(Simple events)
  • 把编程语言比喻为人体
  • Qt5学习之路(vs2012下创建一个QT应用程序)2013-10-14
  • 说说我在家乡山东日照的面试经历以及对家乡互联网产业的一些认识吧
  • mysql实现随机查询
  • SICP 习题 (1.15) 解题总结
  • 编码规范之美.佛语释道
  • 小智慧63
  • 自己写Lucene分词器原理篇——CJKAnalyzer简单讲解
  • 如何建立基于CocoaPods的ReactiveCocoa工程
  • Webservice-XML与Java(五)
  • Java中SimpleDateFormat用法详解
  • Parcelable protocol requires a Parcelable.Creator object called。。。。。
  • MOTOROLA MC40 android系统扫描开发
  • JS 中的深拷贝与浅拷贝
  • (三)从jvm层面了解线程的启动和停止
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • create-react-app项目添加less配置
  • HashMap ConcurrentHashMap
  • Java 网络编程(2):UDP 的使用
  • JS笔记四:作用域、变量(函数)提升
  • Ruby 2.x 源代码分析:扩展 概述
  • Terraform入门 - 1. 安装Terraform
  • 观察者模式实现非直接耦合
  • 基于 Babel 的 npm 包最小化设置
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊sentinel的DegradeSlot
  • 前端路由实现-history
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • scrapy中间件源码分析及常用中间件大全
  • 带你开发类似Pokemon Go的AR游戏
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #define、const、typedef的差别
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (六)Hibernate的二级缓存
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (三)模仿学习-Action数据的模仿
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 解决重复提交问题
  • .net 托管代码与非托管代码
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • [<MySQL优化总结>]
  • [20160807][系统设计的三次迭代]