java jdk动态代理和cglib动态代理对比,实现,区别
jdk动态代理和cglib动态代理对比
jdk动态代理
特点
- Interface:对于JDK Proxy,业务类是需要一个Interface的,这是一个缺陷;
- Proxy:Proxy类是动态产生的,这个类在调用Proxy.newProxyInstance()方法之后,产生一个Proxy类的实力。实际上,这个Proxy类也是存在的,不仅仅是类的实例,这个Proxy类可以保存在硬盘上;
- Method:对于业务委托类的每个方法,现在Proxy类里面都不用静态显示出来。
- InvocationHandler:这个类在业务委托类执行时,会先调用invoke方法。invoke方法在执行想要的代理操作,可以实现对业务方法的再包装。
总结
:
- JDK动态代理类实现了InvocationHandler接口,重写的invoke方法。
- JDK动态代理的基础是反射机制(method.invoke(对象,参数))Proxy.newProxyInstance()
cglib动态代理
特点
- 原理是对指定的目标生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
注意
:jdk的动态代理只可以为接口去完成操作,而cglib它可以为没有实现接口的类去做代理,也可以为实现接口的类去做代理。
代码实现
公共代码部分
//接口类
public interface FoodService {
public void makeNoodle();
public void makeChicken();
}
//实现接口
public class FoodServiceImpl implements FoodService {
@Override
public void makeNoodle() {
System.out.println("make noodle");
}
@Override
public void makeChicken() {
System.out.println("make Chicken");
}
}
jdk动态代理
jdk动态代理代码
public class JDKProxyFactory implements InvocationHandler {
private Object target;
public JDKProxyFactory(Object target) {
super();
this.target = target;
}
// 创建代理对象
public Object createProxy() {
// 1.得到目标对象的类加载器
ClassLoader classLoader = target.getClass().getClassLoader();
// 2.得到目标对象的实现接口
Class<?>[] interfaces = target.getClass().getInterfaces();
// 3.第三个参数需要一个实现invocationHandler接口的对象
Object newProxyInstance = Proxy.newProxyInstance(classLoader, interfaces, this);
return newProxyInstance;
}
// 第一个参数:代理对象.一般不使用;第二个参数:需要增强的方法;第三个参数:方法中的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("这是增强方法前......");
Object invoke = method.invoke(target, args);
System.out.println("这是增强方法后......");
return invoke;
}
public static void main(String[] args) {
// 1.创建对象
FoodServiceImpl foodService = new FoodServiceImpl();
// 2.创建代理对象
JDKProxyFactory proxy = new JDKProxyFactory(foodService);
// 3.调用代理对象的增强方法,得到增强后的对象
FoodService createProxy = (FoodService) proxy.createProxy();
createProxy.makeChicken();
}
}
cglib动态代理
cglib动态代理代码
public class CglibProxyFactory implements MethodInterceptor {
//得到目标对象
private Object target;
//使用构造方法传递目标对象
public CglibProxyFactory(Object target) {
super();
this.target = target;
}
//创建代理对象
public Object createProxy(){
//1.创建Enhancer
Enhancer enhancer = new Enhancer();
//2.传递目标对象的class
enhancer.setSuperclass(target.getClass());
//3.设置回调操作
enhancer.setCallback(this);
return enhancer.create();
}
//参数一:代理对象;参数二:需要增强的方法;参数三:需要增强方法的参数;参数四:需要增强的方法的代理
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("这是增强方法前......");
Object invoke = methodProxy.invoke(target, args);
System.out.println("这是增强方法后......");
return invoke;
}
public static void main(String[] args) {
// 1.创建对象
FoodServiceImpl foodService = new FoodServiceImpl();
// 2.创建代理对象
CglibProxyFactory proxy = new CglibProxyFactory(foodService);
// 3.调用代理对象的增强方法,得到增强后的对象
FoodService createProxy = (FoodService) proxy.createProxy();
createProxy.makeChicken();
}
}