1、动态代理
通过java反射或者字节码技术自动帮助我们在运行的时候创建代理类对象!
2、动态代理有几种?
JDK动态代理
CGLIB动态代理
3、JDK动态代理模式
创建抽象主题角色(说的那么高大上,其实就是接口):
public interface Subject {
void send();
}
创建被代理类(其实就是接口的主实现类)
public class RealSubject implements Subject {
public void send() {
System.out.println("实现主要业务逻辑");
}
}
用jdk创建动态代理
public class SubjectProxy implements InvocationHandler{
//被代理类对象
private Object obj;
public SubjectProxy(Object obj) {
this.obj = obj;
}
//实现invoke方法,通过method反射拿到obj的对象
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("》》》》实现日志打印,或者其他操作");
Object invoke = method.invoke(obj, args);//java反射机制执行目标对象方法
System.out.println("》》》》实现日志打印,或者其他操作结束");
return invoke;
}
/***
* 使用jdk创建代理类
*
*/
@SuppressWarnings("unchecked")
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
}
main运行:
public class SubjectMain {
/**
* @param args
*/
public static void main(String[] args) {
//新建代理类,这个返回值必须是接口,否则将会报错
Subject proxy = new SubjectProxy(new RealSubject()).getProxy();
proxy.send();
}
}
下一章:GCGLIB动态代理