实例讲解Java中动态代理和反射机制

  

<强>反射机制

  

Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法,属性和构造方法等。

  

动态代理:分为JDK动态代理,cglib动态代理(春天中的动态代理)。

  

<强>静态代理

  

预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理

  

<强>动态代理

  

代理类在程序运行时创建的代理方式。也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的“指示“动态生成的。

  

动态代理比静态代理的优势在于:

  

动态代理可以很方便的对代理类的函数进行统一的处理(调用),而不是修改每个代理类的函数,更灵活和扩展。

  

JDK的动态代理(依赖于接口)

  

在Java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler接口,另一个是代理类。

  

InvocationHandler接口是给动态代理类实现的,负责处理被代理对象的操作

  

代理类是用来创建动态代理类实例对象的,只有得到这个对象,才能调用需要代理的方法。

  

动态代理的代理类是在静态代理类上进行修改,将动态代理类实现InvocationHandler接口,JAVA电子书重写调用方法,调用方法通过传入的被代理类方法和参数来执行。

  

如下实例:

        公共接口AppService {   空白createApp(字符串名称);   空白deleteApp(字符串名称);   }//代理类(比如微商代理)   公共类AppServiceImpl实现AppService {      @Override   公共空间createApp(字符串名称){   system . out。print(“应用程序(“+名字+”)已创建。”);   }      @Override   公共空间deleteApp(字符串名称){   system . out。print(“应用程序(“+名字+”)被删除。“);   }   }      进口java.lang.reflect.InvocationHandler;   进口java.lang.reflect.Method;      公共类LoggerInterceptor实现InvocationHandler {   私有对象目标;//委托类(被代理类)的实例,比如厂家   公共LoggerInterceptor(对象目标){   这一点。目标=目标;   }   @Override   公共对象调用对象代理、方法方法,对象[]args)抛出Throwable {   system . out。println(“输入”+ target.getClass () . getname () +“-”+ method.getName() +”,使用参数{+ args [0] +“}”);   结果=方法对象。调用(目标,args);//调用目标对象的方法(调用厂家的方法(createApp)及参数(Kevin测试)   system . out。println(“之前返回:“+结果);   返回结果;   }      }            进口java.lang.reflect.Proxy;      公共类测试{      公共静态void main (String [] args) {   AppService目标=new AppServiceImpl();//生成目标对象(代理类的对象)//接下来创建代理对象   AppService代理=(AppService) Proxy.newProxyInstance (   .getClassLoader target.getClass () (),   新LoggerInterceptor .getInterfaces target.getClass()(),(目标));   代理。createApp (Kevin Test1);   proxy.deleteApp (Kevin Test2);   }      }/* *   * 1,jdk的动态代理实现方式是依赖于接口的,首先使用接口来定义好操作规范。   * 2,通过代理类产生的代理对象调用被代理对象的操作。   * 3,而这个操作又被分发给InvocationHandler接口的调用方法具体执行   *   *在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler接口,另一个则是代理类,这个类和接口是实现我们动态代理所必须用到的。   InvocationHandler接口是给动态代理类实现的,负责处理被代理对象的操作的,而代理是用来创建动态代理类实例对象的,因为只有得到了这个对象我们才能调用那些需要代理的方法。   *   *此方法的参数含义如下   代理:代表动态代理对象   方法:代表正在执行的方法   参数:代表当前执行方法传入的实参   返回值:表示当前执行方法的返回值   *   *如上:   *使用了代理类的newProxyInstance方法生成代理对象,然后用这个对象去调用createApp()和deleteApp()方法,   *其实系统会将这2个方法分发给invoke()方法区执行。其中代理对象的类是系统帮我们动态创建了,其实实现了我们的业务接口AppService   *   */      

<强> cglib动态代理(继承方式)

  

实例讲解Java中动态代理和反射机制