`
jzkangta
  • 浏览: 157821 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java代理之CGLIB动态代理

    博客分类:
  • JAVA
阅读更多
之前有写过一个JDK的动态代理,但是却局限于接口实现,也就是说代理目标类必须要有一个接口。

加入需要被代理的类没有提供接口的话,是不可以使用JDK动态代理的。

那么使用CGLIB的话,目标类就有自己的接口去实现。

它可以生成目标类的子类,并且重写父类的非Final修饰的方法。

可以再Spring的lib里找到cglib的jar包

还是写一个小例子:

一个代理目标类:
package com.jzkangta.demo;

public class PersonService {

	public void savePerson() {
		// TODO Auto-generated method stub
		System.out.println("添加用户了........");
	}
}


一个生成代理对象的Factory:
package com.jzkangta.demo;

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 ProxyFactory implements MethodInterceptor{

	private Object targetObject; // 需要代理的目标对象

	//创建代理对象  也可以用构造方法来做
	public Object createProxyIntance(Object targetObject) {
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();//使用Enhancer来创建代理对象
		enhancer.setSuperclass(this.targetObject.getClass());//需要把代理目标类设置为Enhancer的父类,这就是说这个生成的代理类继承了代理目标类
		enhancer.setCallback(this);//这个this参数和之前JDK动态代理里newProxyInstance的第三个参数一样,是个回调方法
		return enhancer.create();
	}


	
	public void testFunction(){
		System.out.println("执行额外的功能方法.........");
	}



	@Override
	public Object intercept(Object arg0, Method method, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		testFunction();
		//此处可以加逻辑判断,只有正确才执行method.invoke方法
		Object result = method.invoke(targetObject, arg2);  //这里是指需要调用目标代理对象的最终方法
		return result;
	}
}


一个客户端调用方法:
package com.jzkangta.demo;

public class Test {

	public static void main(String[] args) {
		ProxyFactory proxyFactory = new ProxyFactory();
		//注意,这里的personService不再是一个接口了
		PersonService personService = (PersonService)proxyFactory.createProxyIntance(new PersonService());
		personService.savePerson();
	}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics