java的代理(静态代理和动态代理实例)

静态代理

 

静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。

 

public interface Person {

       voidgiveMoney();

}

 

public class Student implements Person {

   private String name;

   public Student(String name) {

       this.name = name;

    }

       @Override

       publicvoid giveMoney() {

              System.out.println(name+ "上交班费50元");

 

       }

 

}

 

public class StudentsProxy implementsPerson {

 

       Studentstu;

      

       publicStudentsProxy(Person stu) {

              if(stu.getClass()== Student.class) {

                     this.stu= (Student)stu;

              }

       }

       @Override

       publicvoid giveMoney() {

              stu.giveMoney();

             

       }

 

}

 

public class StaticProxyTest {

 

       publicstatic void main(String[] args) {

              Personzhangsan = new Student("张三");

              Personmontor =  new StudentsProxy(zhangsan);

              montor.giveMoney();

 

       }

 

}

动态代理

动态代理模式主要由四个元素共同构成:

 

1. 接口,接口中的方法是要真正去实现的

2. 被代理类,实现上述接口,这是真正去执行接口中方法的类

3. 代理类,实现InvocationHandler,帮助被代理类去实现方法

4. 测试用例:

public interface ArithmeticCalculator {

   public int add(int i, int j);

    public int sub(int i, int j);

   public int mul(int i, int j);

   public int div(int i, int j);

}

 

public class ArithmeticCalculatorImplimplements ArithmeticCalculator {

 

       @Override

       publicint add(int i, int j) {

              intresult = i + j;

              returnresult;

       }

 

       @Override

       publicint sub(int i, int j) {

              intresult = i - j;

              returnresult;

       }

 

       @Override

       publicint mul(int i, int j) {

              intresult = i * j;

              returnresult;

       }

 

       @Override

       publicint div(int i, int j) {

              intresult = i / j;

              returnresult;

       }

 

}

 

public classArithmeticCalculatorLoggingProxy {

   private ArithmeticCalculator target;

   public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target) {

           this.target = target;

    }

public ArithmeticCalculatorgetLoggingProxy() {

           ArithmeticCalculator proxy = null;

           //代理对象由哪一个类加载器加载

           ClassLoader loader =target.getClass().getClassLoader();

           //代理对象类型,即其中有哪些方法

           Class [] interfaces = new Class[]{ArithmeticCalculator.class};

           //当调用代理对象其中方法,该执行代码

           InvocationHandler h = newInvocationHandler() {

       /**

       *proxy:正在返回的那个代理对象,一般情况下在invoke方法中都不使用该对象

       *method:正在被调用的方法

       *args:调用方法时传入的参数

       */

       @Override

       publicObject invoke(Object proxy, Method method, Object[] args) throws Throwable {

       Stringmethodname = method.getName();

       System.out.println("Themethod " + methodname + "brgins with" + Arrays.asList(args));

                            Objectresoult = method.invoke(target, args);

                            System.out.println("Themethod " + methodname + "end with" + resoult);

                            returnresoult;

                     }

              };

           proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);

           return proxy;

    }

}

 

public class Main {

 

       publicstatic void main(String[] args) {

              ArithmeticCalculatortarget = new ArithmeticCalculatorImpl();

              ArithmeticCalculatorproxy = new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();

              intresult = proxy.add(1, 2);

              System.out.println(result);

       }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王茗颢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值