对于无接口的类,要为其创建动态代理,可以使用 CGLIB 来实现。CGLIB 代理的生成原理是生成目标类的子类,而子类是增强过的,
这个子类对象就是代理对象。所以,使用CGLIB 生成动态代理,要求目标类必须能够被继承,即不能是 final 的类。
还是直接附上案例
首先需要导入 CGLIB 的 Jar 包: cglib-full.jar。
目标类
package com.demo;
public class AccountService {
public void transfer(){ //主业务逻辑
System.out.println("调用Dao层,完成转账业务");
}
public void getBalance(){ //主业务逻辑
System.out.println("调用Dao层,完成查询余额");
}
}
Cglig代理工厂类
package com.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 AccountServiceCglibProxyFactory implements MethodInterceptor{
private AccountService target; //目标对象
public AccountServiceCglibProxyFactory(AccountService target) {
this.target = target;
}
public AccountService createProxy(){ //工厂方法
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(AccountService.class);
enhancer.setCallback(this);
return (AccountService) enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable { //回调接口方法
if("transfer".equals(method.getName())){
System.out.println("开始时间" + System.currentTimeMillis());
Object result = method.invoke(target, args);
System.out.println("结束时间" + System.currentTimeMillis());
return result;
}
return method.invoke(target, args);
}
}
测试代码
package com.demo;
public class Client {
public static void main(String[] args) {
AccountService target = new AccountService(); //目标对象
AccountService proxy = new AccountServiceCglibProxyFactory(target).createProxy();//代理对象
proxy.transfer();
proxy.getBalance();
}
}