大家好呀,最近开学,时隔大半年再次回到校园,着实有些怀念呀,又忙了几天,停更了几天, 今天,话不多说,来聊一聊Java中的动态代理,废话不多时,直接进入正题
目前java动态代理的实现分为两种
1.基于JDK的动态代理
2.基于CGILB的动态代理
在业务中使用动态代理,一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。我们一般所熟知的Spring的AOP原理就是基于动态代理实现的。
主要讲一讲JDK动态代理
基于JDK的动态代理就需要知道两个类:
1.InvocationHandler(接口)
2.Proxy(类)
还要知道JDK是基于接口的动态代理
下面我用实际用代码来讲解这两个类的实际作用
1.第一步,创建一个接口
public interface Subject {
void hello(String param);
}
2.第二步,实现接口
public class SubjectImpl implements Subject {
@Override
public void hello(String param) {
System.out.println("hello " + param);
}
}
3.第三步,创建SubjectImpl的代理类
public class SubjectProxy implements InvocationHandler {
private Subject subject;
public SubjectProxy(Subject subject) {
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("--------------begin-------------");
Object invoke = method.invoke(subject, args);
System.out.println("--------------end-------------");
return invoke;
}
}
invoke方法的说明:
4.编写代理类实际的调用,利用Proxy类创建代理之后的Subject类。
输出:
看这个结果,实际上在Subject类中只会输出一条hello world,但是在被代理之后,实际调用的方法是SubjectProxy的invoke方法,这样可以在不修改业务类的情况下对业务类增加一些日志等其他操作,甚至可以直接修改有返回值方法的返回值。
动态代理的原理
代理设计模式的原理:使用一个代理将原本对象包装起来,然后用该代理对象”取代”原始对象。 任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
对生活有态度,对技术有追求,一起加油哈