静态代理:
//代理类和被代理类都需要实现的接口 public interface Movie { void play(); } //被代理的类,实际的操作所在对象 public class RealMovie implements Movie{ @Override public void play() { System.out.println("you are seeing moving"); } } //代理类,用户去调用的是这个类,这个类对象里面再去调用真实操作的对象 public class Ciema implements Movie{ RealMovie movie; public Ciema(RealMovie realMovie) { super(); this.movie=realMovie; } @Override public void play() { adFunc(); movie.play(); adFunc(); } private void adFunc() { System.out.println("guanggao..."); } } public class Test { public static void main(String[] args) { RealMovie realMovie=new RealMovie(); Movie movie=new Ciema(realMovie); movie.play(); } }
动态代理
public interface SellWine { void mainJiu(); } public class MaotaiJiu implements SellWine{ @Override public void mainJiu() { System.out.println(" sell maotai"); } } public class GuitaiA implements InvocationHandler{ private Object pingpai; public GuitaiA( Object pingpai) { this.pingpai=pingpai; } // InvocationHandler 内部只是一个 invoke() 方法,正是这个方法决定了怎么样处理代理传递过来的方法调用 // proxy 代理对象 // method 代理对象调用的方法 // args 调用的方法中的参数 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(" guitai is :" +this.getClass().getSimpleName()); method.invoke(pingpai, args); System.out.println("sell ending "); return null; } } public class Test { public static void main(String[] args) { MaotaiJiu maotaiJiu = new MaotaiJiu(); InvocationHandler jingxiao1 = new GuitaiA(maotaiJiu); // loader 类加载器 // interfaces 代码要用来代理的接口 // h 一个 InvocationHandler 对象 SellWine dynamicProxy = (SellWine) Proxy.newProxyInstance(MaotaiJiu.class.getClassLoader(), MaotaiJiu.class.getInterfaces(), jingxiao1); dynamicProxy.mainJiu(); } }
参考:https://blog.csdn.net/briblue/article/details/73928350
https://www.cnblogs.com/cenyu/p/6289209.html