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

    动态代理

    1. 只学一个方法:

    Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);

     方法的作用:在运行时,动态创建一组指定的接口的实现类对象!(在运行时,创建实现了指定的一组接口的对象)

    interface A {

    }

    interface B {

    }

    Object o = 方法(new Class[]{A.class,B.class})

    o它实现了A和B两个接口!

     

    Object proxyObject = Proxy.newProxyInstance(ClassLoader classLoader, Class[] interfaces, InvocationHandler h);

    1. 方法作用:动态创建实现了interfaces数组中所有指定接口的实现类对象!

    三大参数介绍:

    1. ClassLoader:类加载器!

    * 它是用来加载器的,把.class文件加载到内存,形成Class对象!

    2. Class[] interfaces:指定要实现的接口们

    3. InvocationHandler:被代理的对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。

    说明:也就是说,实现动态代理需要三大参数。

    2. 动态代理作用

    最终是学习AOP(面向切面编程),它与装饰者模式有点相似,它比装饰者模式还要灵活!

    InvocationHandler

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

     

    这个invoke()方法在什么时候被调用!

    1. 在代理对象被创建时?错误的!

    2. 在调用代理对象所实现接口中的方法时?正确的!

     

    * Object proxy:当前对象,即被代理的对象!在调用谁的方法!

    * Method method:当前被调用的方法(目标对象的方法)

    * Object[] args:实参!

    他们之间的对应关系:

    目标对象:被增强的对象

    代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!

    目标方法:增强的内容

    代理对象 = 目标对象 + 增强

     

    实例:使用 三大参数来创建 代理对象:Dome1.java

    /**

    * @function 使用三大参数来创建代理对象

    * @author not-bug

    *

    */

    public class Demo1 {

        @Test

        public void fun1() {

            /*

             * 三大参数

             * 1. ClassLoader

             * 方法需要动态生成一个类,这个类实现了AB接口,然后创建这个类的对象!

             * 需要生成一个类,这个类也需要加载到方法区中,谁来加载,当然是ClassLoader!!!

             *

             * 2. Class[] interfaces

             * 它是要实现的接口们,也就是说,你需要实现的接口

             *

             * 3. InvocationHandler

             * 它是调用处理器

             * 敷衍它!

             *

             * 代理对象中实现所有接口中的方法,内容都是调用InvocationHandlerinvoke()方法。

             */

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

            InvocationHandler h = new InvocationHandler() {

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

                        throws Throwable {

                    System.out.println("你好,动态代理!");

                    return "xxx";

                }

            };

            // 使用三大参数创建代理对象!!!

            Object o = Proxy.newProxyInstance(loader, new Class[]{A.class, B.class}, h);

            

            // 强转成AB类型,成功了!

            A a = (A) o;

            B b = (B) o;

            

    //        a.a();

    //        a.aa();

    //        b.b();

    //        b.bb();

            

    //        System.out.println(o.getClass().getName());

            //调用被代理对象所实现的接口方法,其实是在调用InvocationHandlerinvoke()方法。

            Object result = a.aaa("hello", 100);

            System.out.println(result);

        }

    }

     

    interface A {

        public void a();

        public void aa();

        public Object aaa(String s, int i);

    }

     

    interface B {

        public void b();

        public void bb();

    }

     

    该实例运行结果:

  • 相关阅读:
    Bootstrap 可视化布局--拖拽后弹窗进行编辑
    Missing letters
    DNA Pairing
    Pig Latin
    Search and Replace
    Where art thou
    Roman Numeral Converter
    Diff Two Arrays
    Sum All Numbers in a Range
    Caesars Cipher
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5452926.html
Copyright © 2011-2022 走看看