1,什么是代理模式!
代理模式就是控制一个对象的访问,可以详细访问某个对象的方法调用处理,或则调用后处理。
2, 代理模式的应用场景
安全代理 可以屏蔽真实角色;
远程代理 远程调用代理类RMI;
延迟加载 先加载轻量级代理类,真正需要再加载真实;
3,代理的分类
- 静态代理(静态定义代理类)
- 动态代理(动态定义代理类)
jdk自带动态代理
Cgilb,javaassist(字节码操作库)
4, 静态代理
静态代理需要自己去实现代理类;******
- 先创建买房的操作
package daili;
public interface hose {
//买房的操作
public void mar();
}
- 实现买房子
package daili;
public class Xiaoming implements hose{
//买房子的人实现买房的想法
@Override
public void mar() {
System.out.println("我要买房子了!");
}
}
3.创建代理类
package daili;
public class Proxy implements hose{
private Xiaoming xiaoming;
public Proxy(Xiaoming xiaoming){
this.xiaoming = xiaoming;
}
@Override
public void invoke() {
// TODO Auto-generated method stub
System.out.println("我是中介,我买房的操作,我开始监听了!");
xiaoming.mar();
System.out.println("我是中介,我买房的操作,我结束监听了!");
}
//测试
public static void main(String[] args) {
Proxy proxy = new Proxy(new Xiaoming());
proxy.invoke();
}
}
5, 动态代理(jdk)
前两步同上,一抹一样!
然后开始创建代理,并且测试
package daili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
*
* 项目名称:shejimoshi
* 类描述:("jdk实现动态代理")
* 创建人:莫参商
* 创建时间:2020-1-11 下午2:52:38
* 修改人:acer
* @version
*
*/
public class jdkProxy implements InvocationHandler{
private Object tarjet;
public jdkProxy(Object tarjet){
this.tarjet = tarjet;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("我是中介,我买房的操作,我开始监听了!");
Object invoke = method.invoke(tarjet, args);
System.out.println("我是中介,我买房的操作,我结束监听了!");
return null;
}
public static void main(String[] args) {
Xiaoming xiaoming = new Xiaoming();
jdkProxy jdkp = new jdkProxy(xiaoming);
hose p = (hose) Proxy.newProxyInstance(xiaoming.getClass().getClassLoader() , xiaoming.getClass().getInterfaces(), jdkp);
p.mar();
}
}
总结
静态代理与动态代理的区别;
看过这两段代码,很多人心里都清楚了,静态代理你需要自己写出来代理类,这就是两种代理中的invoke方法,静态代理是每一个接口都需要手写这样的一个代理类,非常麻烦,
而动态代理只需要写一个代理类就ok了。
jdk自带的动态代理是用反射机制实现的。