Java代理之CGLIB动态代理

之前有写过一个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();
	}

}

你可能感兴趣的:(java,spring,jdk,.net)