代理:
即代购;比如:自己去商店购买某个产品,或者找其他人代为购买,以达到自我目的;静态代理:
java中的代理模式:
指代码不直接访问⽬标对象,⽽是通过⼀个代理对象来访问⽬标对象,代理对象充当⼀个中介作⽤。
静态代理:
在jvm运⾏之前就已经获取到代理类的class信息.
特点:
代理角色和真实角色都需要实现同一个接口
真实角色专注于自己的事情;
代理角色目的就是帮助真实角色完成一件事情
public class Demo {
public static void main(String[] args) {
Mary imMary = new ImMary();
ImMary1 imMary1 = new ImMary1(imMary);
imMary1.mary();
}
}
interface Mary{
void mary();
}
//目标类:
class ImMary implements Mary{
@Override
public void mary() {
System.out.println("我要结婚了,我好高兴!");
}
}
//代理类:
class ImMary1 implements Mary{
private Mary mary;
//有参构造
public ImMary1(Mary mary) {
this.mary = mary;
}
@Override
public void mary() {
System.out.println("结婚之前布置现场");
mary.mary();
System.out.println("婚礼结束,付尾款");
}
}
动态代理:
在java程序运⾏过程(程序已经启动在运⾏了)由jvm⽣成代理类的class信息,该class信息⽣成后是直接处于内存中的,并没有写⼊磁盘保存起来;然后通过反射⽅式实例化代理类对象,因为代理类的class信息已经存在于内存中,所以可以通过反射⽅式实例化。
特点:
public class Demo {
public static void main(String[] args) {
ImMary imMary = new ImMary();
MyInvocation myInvocation = new MyInvocation(imMary);
Object o = Proxy.newProxyInstance(
imMary.getClass().getClassLoader(),
imMary.getClass().getInterfaces(),
myInvocation
);
imMary.mary();
}
}
//接口:
public interface Mary {
void mary();
}
//目标类:
public class ImMary implements Mary {
@Override
public void mary() {
System.out.println("我要结婚了,我好高兴");
}
}
//实现InvocationHandler接口的子类:
public class MyInvocation implements InvocationHandler {
private Object a;
public MyInvocation(Object a) {
this.a = a;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("婚前准备");
Object invoke = method.invoke(a, args);
System.out.println("婚后支付尾款");
return invoke;
}
}
基于接口实现的