zoukankan      html  css  js  c++  java
  • 动态代理Dynamic Proxy

      代理模式是常用的Java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类

    预处理消息,过滤消息,把消息转发给委托类,以及事后处理消息等。

      代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身

    并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定服务。

    动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。

    Java反射机制可以生成任意类型的动态代理类。java.lang.reflect包中的Proxy类和invocationHandler接口提供了

    生成动态代理类的能力。

    InvocationHandler接口:

    public interface InvocationHandler{

      public Object invoke(Object proxy,Method method, Object[] args)throws Throwable;

      //  返回值null      1.指被代理的对象2.要调用的方法3.方法调用时所需要的参数

    }

    Proxy类:

    是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了(静态方法)如下的操作方法:

    public sattic Object newProxyInstance(ClassLoader  loader,Class<?>[]  interfaces,  InvocationHandler  h)throws IllegalArgumentException

    参数说明:ClassLoader  loader:类加载器

         Class<?>[]  interfaces: 得到全部的接口

         InvocationHandler  h:得到InvocationHandler接口的子类实例

    类对象.getClass.getClassLoader();---获得类加载器


    举例:一个吃饭的例子,我们只管吃饭,把饭前洗手,饭后刷碗的重复事情交给代理类来完成

    Dinner.java-----接口

    1 package Jun.Proxy;
    2 
    3 public interface Dinner {
    4     public String haveDinner();
    5 }

    MyDinner.java------自己的实现类-------委托类

     1 package Jun.Proxy;
     2 
     3 public class MyDinner implements Dinner{
     4 
     5     @Override
     6     public String haveDinner() {
     7         System.out.println("妈妈做的饭真好吃。。。。。");
     8         return "真得好吃====";
     9     }
    10 
    11 }

    MyDinnerProxy.java--------代理类

    功能就是,给它一个委托类对象,会返回一个代理类对象,使用的是Proxy类的方法

    Proxy.newProxyInstance----得到代理类对象(实例)

     1 package Jun.Proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 public class MyDinnerProxy implements InvocationHandler{
     8 
     9     private Object originalObject;//被代理的原始对象
    10     
    11     //绑定原始对象,返回一个代理对象
    12     public Object bind(Object obj) {
    13         this.originalObject=obj;
    14         //里面的参数1:类加载器2:得到全部的接口3:得到InvocationHandler接口的实例---当前对象本身实现的这个接口
    15         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    16     }
    17     
    18     //吃饭之前要执行的方法
    19     private void preMethod() {
    20         System.out.println("吃饭之前要洗手。。。");
    21     }
    22     //吃饭之后要执行的方法
    23     private void afterMethod() {
    24         System.out.println("吃饭之后要刷碗。。。。");
    25     }
    26     @Override
    27     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    28         preMethod();
    29         Object result=method.invoke(this.originalObject, args);
    30         afterMethod();
    31         //invoke方法返回一个对象
    32         System.out.println("hahahahahhaha----"+result);
    33         return result;
    34     }    
    35 }

    MyDinnerProxyDemo.java-----测试

     1 package Jun.Proxy;
     2 
     3 public class MyDinnerProxyDemo {
     4 
     5     public static void main(String[] args) {
     6         Dinner din=new MyDinner();
     7 //        din.haveDinner();
     8         //代理类的实列
     9         MyDinnerProxy pro=new MyDinnerProxy();
    10         //返回了一个代理对象
    11         din=(Dinner) pro.bind(din);
    12         String str=din.haveDinner();
    13         System.out.println("----------------------");
    14         System.out.println(str);
    15     }
    16 }
  • 相关阅读:
    父子项目
    生成资源文件时候,可以动态替换为maven属性
    生命周期阶段与插件目标任务绑定
    私服
    仓库
    DotNetBar教程
    SQL基础--> 约束(CONSTRAINT)
    jQuery.Autocomplete实现自动完成功能(详解)
    C# 解析JSON格式数据
    JSON 数据格式解析
  • 原文地址:https://www.cnblogs.com/xjs1874704478/p/10720269.html
Copyright © 2011-2022 走看看