A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

俊小子

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 俊小子 初级黑马   /  2018-8-27 10:10  /  509 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

上一篇写了用Java中的反射完成的Java的对象工厂的创建,这篇文章就Java中的动态代理来写一篇要实现Java的动态代理,我们首先需要了解一个类Proxy,一个接口InvocationHandler。所有要实现动态代理的类必须实现InvacationHandler接口,并且实现其中的invoke方法。下面我先用代码演示一下需要增强的类实现的接口:public interface ProxyDemo {void say();void sayName(String name);Object getValue(String parameterName);}需要增强的类:import com.itheima.interfacedemo.ProxyDemo;public class ProxyRefact implements ProxyDemo { @Override public void say() {  // TODO Auto-generated method stub  System.out.println("helloWorld........"); } @Override public void sayName(String name) {  // TODO Auto-generated method stub  System.out.println("你好"+name); } public void nimei(){  System.out.println("我是来炒蛋的"); } @Override public Object getValue(String parameterName) {  return parameterName; }}实现了InvacationHandler接口的代理类class MyInvocationHandler implements InvocationHandler{ private static ProxyDemo newProxyInstance;//被代理类的对象(ProxyDemo 为被代理对象实现的接口,在这里这样用是为了增加代码的可复用性)//通过构造方法对被代理类进行赋值 public MyInvocationHandler(ProxyDemo demo){  this.object=demo; }//在这个方法中没有做任何处理只是将原本的方法执行了一下 @Override public Object invoke(Object object, Method method, Object[] parameter)   throws Throwable {   System.out.println("我是前置增强的代码");  Object arg0=method.invoke(newProxyInstance, parameter);  System.out.println("我是后置增强的代码");  return arg0; } }测试类的代码:public class TestDemo {public static void main(String[] args) { ProxyRefact refact=new ProxyRefact();//被代理类的对象 MyInvocationHandler handler = new MyInvocationHandler(refact);//代理对象 //Proxy.newProxyInstance(ClassLoad loader,Class<?>[] interfaces,InvocationHandler h); //使用动态代理 //1:ClassLoader              :类加载器。 //2:Class<?>[]                :被增强的对象实现的所有接口 //3:InvocationHandler  :处理类 ClassLoader load=TestDemo.class.getClassLoader(); Class[] classes=ProxyRefact.class.getInterfaces();//注意此处的classes必须使用实现类的对象进行调用出来,或者使用 ProxyDemo newProxyInstance = (ProxyDemo) Proxy.newProxyInstance(load, classes, handler); newProxyInstance.sayName("hellokity");}}运行的结果:参数详解:当我们要使用动态代理的时候需要调用Proxy中的静态方法Proxy.newProxyInstance(ClassLoad    loader,Class<?>[] interfaces,InvocationHandler h);Class<?>[] interfaces:被代理类所实现的所有接口的集合InvocationHandler:为实现InvacationHandler接口的类的对象其中ClassLoad 为类加载器;当我们调用该方法是Proxy自动返回一个Object对象,该对象为我们的代理对象。将该对象强转为我们需要的接口类对象。然后调用接口中的方法。运行时,自动跳转到我们自己的动态代理类中invoke方法中invoke方法中的参数详解invoke(Object object, Method method, Object[] parameter)其中object为代理对象,用的很少。method为对象调用的方法。parameter为调用方法的参数那么我们现在来分析一下动态代理的执行流程首先我们通过proxy生成我们的代理类对象,并且将代理类对象强转为我们需要用的接口类,然后用接口类来调用方法,注意,其实此处返回的对象为我们proxy生成的对象,所以无论我们用这个对象调用何种方法,其都会跳转到我们的InvocationHandler类的实现类中的invoke方法中,所以我们只需要在invoke方法中做判断是否是我们需要加强的类,如果是那么执行加强的操作,如果不是那么我们直接调用之前的方法

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马