欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

静态代理、动态代理

程序员文章站 2022-06-10 20:49:21
...

静态代理:基于接口,一个静态代理只能代理一个类

interface ISubject {//真实业务
    void eat();
}
class RealSubject implements ISubject {//真实对象
    @Override
    public void eat() {
        System.out.println("吃饭");
    }
}
public class ProxySubject implements ISubject {//代理对象
    public ISubject iSubject;//代理的真实对象

    public ProxySubject(ISubject iSubject) {
        this.iSubject = iSubject;
    }

//代理对象额外添加的业务
    public void before() {
        System.out.println("出门");
    }
  public void after() {
        System.out.println("回家");
    }

    @Override
    public void eat() {
        before();
        this.iSubject.eat();//真实对象的业务
        after();
    }
    public static void main(String[] args) {
        ProxySubject proxySubject=new ProxySubject(new RealSubject());
        proxySubject.eat();
    }
}

动态代理:一个代理类代理了所有类似接口,而不再是具体实现一个接口

 interface ISubject {//真实业务
    void eat();
}
class RealSubject implements ISubject {//真实对象
    @Override
    public void eat() {
        System.out.println("吃饭");
    }
}
public  class Prox implements InvocationHandler {//实现InvocationHandler接口

    /*目标对象*/
    public Object target;

    /*,自己写的一个方法,目的是帮助我们生成代理对象*/
    public Object newInstance(Object object){
        this.target=object;
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
                this.target.getClass().getInterfaces(),this);


    }

    /*
    * proxy:目标对象
    *method:目标对象中的方法
     *args:目标对象方法中的参数
    * 该方法是由系统自动调用的,不是自己调用的
    * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object object=method.invoke(this.target,args);//反射的方式实现某个对象的方法调用
        after();
        return  object;
    }
    public void before(){

        System.out.println("打扮");
    }
    public void after(){

        System.out.println("购物");
    }

    public static void main(String[] args) {
        ISubject prox= (ISubject) new Prox().newInstance(new RealSubject());
        prox.eat();
    }
}

进行动态代理的实现,代理类不再具体实现一个接口,而是实现InvocationHqandler接口。
其中代码中
Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
this.target.getClass().getInterfaces(),this);
调用的是
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法
ClassLoader loader:目标对象(target)的类加载器,通过反射就能知道该类的信息了
Class<?>[] interfaces:目标对象(target)所实现的接口,即就能知道目标对象的主营业务了
InvocationHandler h:代表的是实现了InvocationHandler 那个接口的类,在该代码中局势Prox 这个类

其中invoke方法是系统来调用的,不是谁来调用的

相关标签: java