代理模式 - 实现无接口的CGLIB动态代理
作者:互联网
未实现任何接口的目标类
/**
* 目标类:未实现任何接口
* @author WanAkiko
*
*/
public class SomeService {
public String doFirst() {
System.out.println("执行目标类的doFirst方法!");
return "WanAkiko";
}
public void doSecond() {
System.out.println("执行目标类的doSecond方法!");
}
}
代理工厂类:
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import service.SomeService;
/**
* CGLIB代理工厂
* 使用CGLIB为无接口的类创建动态代理,其实现原理是生成目标类(必须能够被继承,即非final修饰的类)的子类,被增强的子类即为代理对象
* @author WanAkiko
*
*/
public class CglibFactory implements MethodInterceptor {
private SomeService target;
public CglibFactory() {}
public CglibFactory(SomeService target) {
super();
this.target = target;
}
/**
* 创建动态代理
* @return 代理对象
*/
public SomeService myCglibCreator() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(SomeService.class); // 指定目标类,采用子类增强父类
// MethodInterceptor底层即实现了Callback接口,因此在setCallback()中传入this即可
enhancer.setCallback(this); // 设置回调接口对象
return (SomeService) enhancer.create(); // 创建Cglib动态代理对象
}
/**
* 回调接口方法的执行条件:代理对象执行目标方法时会触发此方法的执行
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object invoke = method.invoke(target, args);
if (null != invoke) {
invoke = ((String)invoke).toUpperCase();
}
return invoke;
}
}
功能测试类:
import factory.CglibFactory;
import service.SomeService;
/**
* 功能测试类
*
* @author WanAkiko
*
*/
public class DynamicProxyTest {
public static void main(String[] args) {
SomeService target = new SomeService(); // 实例化目标类
// 通过实例化代理工厂类并调用其创建代理对象的方法创建service对象
SomeService service = new CglibFactory(target).myCglibCreator();
String result = service.doFirst();
System.out.println(result);
service.doSecond();
}
}
运行示例(程序Debug时含带$$的即为代理对象):
标签:SomeService,target,invoke,代理,接口,CGLIB,import,public 来源: https://blog.csdn.net/qq_44965393/article/details/110804228