目录
提醒:
动态代理已经属于稍高级的代理方式了,如果不理解代理模式是什么,建议先看看我另一篇文章,会详细讲解代理模式是什么。
java开发,必须要懂的23种设计模式——代理模式(静态代理模式)
动态代理是什么?
动态和静态是相对的,既然静态是被代理对象不能变化,那么动态就是被代理对象可以变化的代理模式。
JDK代理是什么?
JDK代理是java-jdk内置的一个方法,我们只要按照api文档去使用这个方法可以实现动态代理。
具体怎么使用这个方法,做个小案例看看就知道了。
JDK代理小案例:
假设你是卖面膜的,我是你的代理。我可以把面膜卖给我的朋友。
卖面膜接口
package 代理模式.动态代理;
public interface IMaskSeller {
// 买面膜方法
void sellMask();
}
你——被代理者
package 代理模式.动态代理;
// 你是被代理对象
public class You implements IMaskSeller {
@Override
public void sellMask() {
System.out.println("卖面膜");
}
}
我——生成代理的类
这个类并不是代理类,而是调用了JDK的方法生成了一个代理类,并且把代理类返回给调用者。
package 代理模式.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 我代理你
public class Me {
private Object target;
public Me(Object target) {
this.target=target;
}
/**
* 这个方法返回的对象是个在内存中生成的代理类
*
* 返回值中,调用了JDK的Proxy类的newProxyInstance方法。这个方法需要传入三个参数。
* 参数1——被代理类的类加载器
* 参数2——被代理类的接口
* 参数3——调用被代理类的方法时触发的方法
* @return
*/
public Object getYouInstance() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是代理,能把面膜卖给自己的盆友");
// 调用被代理类的方法,returnValue是方法执行的返回值。
Object returnValue = method.invoke(target, args);
return returnValue;
}
});
}
}
我的朋友——客户端
package 代理模式.动态代理;
// 相当于客户端
public class MyFriend {
public static void main(String[] args) {
// 被代理对象
You you = new You();
// 获取动态代理对象
IMaskSeller me = (IMaskSeller) new Me(you).getYouInstance();
me.sellMask();
}
}
小结:
如上所示:
1. 实现同代代理的关键是:Proxy.newProxyInstance方法,我们只需要按照方法的注释填写相应的参数就行。
与静态代理的区别:
不同:
看过我讲静态代理模式的童鞋,应该可以看出,他们的不同之处:
不同1:
静态代理是代理固定的类,需要实现接口,
动态代理生成类不需要实现接口。
不同2:
动态代理使用Proxy.newProxyInstance方法,动态生成了一个代理类。
不同:
获取代理类的方法不是,
静态代理直接实例化代理类。
动态代理调用getYouInstance获取代理类。
相同:
静态代理模式和动态代理模式(JDK代理)的实现原理是一样的。
本质上都是实现共同的接口,然后去实现的代理模式。
只不过,静态代理,是我们自己写好的代理类,动态代理是在内存中,动态的去创建了一个接口的代理类。
以上为个人所学和总结,如果那里不对,希望看到的大佬指正!