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();
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值