CGLib动态代理

标签: cglib 代理 | 发表时间:2012-06-28 22:17 | 作者:
出处:http://www.iteye.com
      由于JDK创建代理有一个限制,它只能为接口创建代理实例,那么对于没有通过接口定义业务方法的类,如何动态创建代理实例呢?显然CGLib是一个很好的选择,CGLib采有底层的字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用。下面就看一下CGLib如何实现动态代理吧。

1、代理目标类
/**
 * 代理目标类
 * @author Leeo
 *
 */
class Task {

	public Task() {

	}

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

}

2、实现动态代理
/**
 * 采用CGLIB实现动态代理
 * @author Leeo
 *
 */
class CglibProxy implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();

	@SuppressWarnings("unchecked")
	public Object getProxy(Class clazz) {
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("begin......" + obj.getClass().getName() + "."
				+ method.getName());
		// 通过代理类调用父类中的方法
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("end......");
		return result;
	}

}

3、代理测试
/**
 * CGLib 动态代理测试
 * @author Leeo
 *
 */
public class CglibProxyTest {


	public static void main(String[] args) {
		
		CglibProxy proxy = new CglibProxy();
		Task task = (Task) proxy.getProxy(Task.class);
		task.run();

	}

}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [cglib 代理] 推荐:

CGLib动态代理

- - ITeye博客
      由于JDK创建代理有一个限制,它只能为接口创建代理实例,那么对于没有通过接口定义业务方法的类,如何动态创建代理实例呢. 显然CGLib是一个很好的选择,CGLib采有底层的字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用. 下面就看一下CGLib如何实现动态代理吧.

Spring AOP 代理机制 JDK&CGLIB

- - 开源软件 - ITeye博客
Spring AOP使用JDK动态代理或者CGLIB来为目标对象创建代理. (建议优先使用JDK的动态代理). 如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理. 所有该目标类型实现的接口都将被代理. 若该目标对象没有实现任何接口,则创建一个CGLIB代理. 如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法) 那也可以.

动态代理双剑客--JDK Proxy与CGLIB

- - CSDN博客推荐文章
研究过设计模式的同胞们都知道代理模式可以有两种实现方案:. 1.接口实现(或继承抽象类). 都可以通过Proxy控制对Target的访问. “接口实现”的方式更加灵活,代理类可以代理所有实现了ISubject接口的类;. “继承父类”的方式代理类只能代理它的父类,因为java中只支持单继承. 如果Target有直接接口,那么这两种方式都可以;.

实现动态代理的两种方式介绍+例子demo(JDK、CGlib)

- - CSDN博客架构设计推荐文章
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢. CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑. JDK动态代理与CGLib动态代理均是实现Spring AOP的基础.

Spring AOP 实现原理与 CGLIB 应用

- - 博客 - 伯乐在线
来源: IBM Developerworks. 简介: AOP(Aspect Orient Programming),也就是面向方面编程,作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等.

java 动态代理(Proxy)

- - BlogJava_首页
动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象. 动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,. 或需要对访问做一些特殊处理等,这时候可以考虑使用代理. 目前 Java 开发包中提供了对动态代理的支持,但现在只支持对接口的实现. 主要是通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口.

Dynamic Proxy (动态代理)

- - CSDN博客推荐文章
动态代理主要有一个 Proxy类 和一个 InvocationHandler接口. 真实主题角色(实现了抽象主题接口). 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法). Proxy 要调用 newProxyInstance方法. 1.抽象主题角色 SubjectDemo.java.

[翻译]web代理链

- - 互联网 - ITeye博客
原文地址: http://resources.infosecinstitute.com/chaining-web-proxies-to-overcome-limitations/. 现在有很多web代理,它们可以无缝隙的工作. 但是由于某些功能不支持,或含有某个bug,所以存在局限性. 因此我们可以使用两个代理来绕过这些局限.

Redis 代理服务Twemproxy

- - CSDN博客云计算推荐文章
      当我们有大量 Redis 或 Memcached 的时候,通常只能通过客户端的一些数据分配算法(比如一致性哈希),来实现集群存储的特性. 虽然Redis 2.6版本已经发布Redis Cluster,但还不是很成熟适用正式生产环境.  Redis 的 Cluster 方案还没有正式推出之前,我们通过 Proxy 的方式来实现集群存储.

JDK动态代理机制

- - CSDN博客编程语言推荐文章
    代理模式有两种,一种是静态代理,这种方式需要为每一个被代理类写一个代理类,显示比较麻烦. 还一种是动态代理,动态代理实现方式一般有两种,JDK动态代理与CGLIB动态代理,这里说一下对JDK动态代理的理解.     JDK动态代理最核心的就类就是java.lang.reflect.Proxy,可调用Proxy.newInstance(..)生成动态代理.