java(7)-反射之动态代理

     //对于接口不编写实现类,直接创建某个interface 的实例
        //通过接口的字节码增强方式创建的类而构造出来的,它是一个临时构造的实现类的对象

        /*
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h) {
         */
        //第一个参数是class加载器,第二个是接口列表,这两个决定了什么类的什么接口
        //第三个是InvocationHandler绝定了功能,
        // InvocationHandler作用就是,
        // 当代理对象的原本方法被调用的时候,会绑定执行一个方法,
        // 这个方法就是InvocationHandler里面定义的内容,同时会替代原本方法的结果返回。
        //InvocationHandler接收三个参数
        //proxy,代理后的实例对象。
        //method,对象被调用方法。
        //args,调用时的参数

        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(method);
                if (method.getName().equals("morning"))
                {
                    System.out.println(args[0]);
                }
                return null;
            }
        };
        World w = (World) Proxy.newProxyInstance(
                World.class.getClassLoader(),
                new Class[] {World.class},
                handler
        );
        w.morning("123");
    }
}

interface World
{
    void morning(String name);
}

/*
动态代理实际上是JDK在运行期动态创建class字节码并加载的过程
public class HelloDynamicProxy implements Hello {
    InvocationHandler handler;
    public HelloDynamicProxy(InvocationHandler handler) {
        this.handler = handler;
    }
    public void morning(String name) {
        handler.invoke(
           this,
           Hello.class.getMethod("morning"),
           new Object[] { name });
    }
}
 */

发布了89 篇原创文章 · 获赞 0 · 访问量 1632

猜你喜欢

转载自blog.csdn.net/qq_43410618/article/details/104411049