版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37606901/article/details/82493004
定义一个目标类的两个方法:
package com.bjpowernode.service;
// 目标类:一个有返回值,一个没有返回值
public class SomeService {
public String doFirst() {
System.out.println("执行doFirst()方法");
return "abcde";
}
public void doSecond() {
System.out.println("执行doSecond()方法");
}
}
代理类:
private SomeService target;
public MyCglibFactory() {
target = new SomeService();
}
这段代码就是定义目标对象并且放在无参数构造函数里面,当函数进行加载的时候就会进行初始化。
package com.bjpowernode.factory;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import com.bjpowernode.service.SomeService;
public class MyCglibFactory implements MethodInterceptor {
private SomeService target;
public MyCglibFactory() {
target = new SomeService();
}
public SomeService myCglibCreator() {
// 创建增强器对象
Enhancer enhancer = new Enhancer();
// 指定目标类,即父类,通过反射技术
enhancer.setSuperclass(SomeService.class);
// 设置回调接口对象
enhancer.setCallback(this);
return (SomeService) enhancer.create();
}
// 回调方法
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
// 调用目标方法
Object result = method.invoke(target, args);
if (result != null) {
result = ((String) result).toUpperCase();
}
return result;
}
}
测试类:
package com.bjpowernode.test;
import com.bjpowernode.factory.MyCglibFactory;
import com.bjpowernode.service.SomeService;
public class MyTest {
public static void main(String[] args) {
SomeService service = new MyCglibFactory().myCglibCreator();
String result = service.doFirst();
System.out.println("result = " + result);
service.doSecond();
}
}
使用JDK的代理要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式进行。cglib代理生成的原理是生成目标类的子类,而子类是增强国的,这个子类对象就是代理对象。所以使用cglib代理生成动态代理,要求目标类必须是可以继承,即不能是final类