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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© China_Riven 中级黑马   /  2015-7-23 21:08  /  240 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/*
* 动态代理:
*                 被代理者
*                 代理者
*
*                 代理者   代理   被代理者   执行方法
*                 执行方法:本来是被代理者的方法,却被代理者代理执行了       
*                 这里的动态:
*                         代理的方法是动态的。
*
* 需求:
*                 使用代理对象   
*                 代理Person的一个对象
*                 调用help方法
*
* JDK提供的代理只能针对接口做代理。
* Proxy:代理类
*         创建动态代理类对象
*         public static Object newProxyInstance(                     通过该方法返回代理对象
*                                                                           ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                               throws IllegalArgumentException

    InvocationHandler:    接口         用于定义如何代理
            Object invoke(Object proxy,    这个方法定义了代理类如何代理
              Method method,
              Object[] args)
              throws Throwable
        proxy:代表代理对象,但是这里不使用!   
        method: 要被代理的方法  就是那个动态的方法
        args:参数

*/
public class Demo {

        public static void main(String[] args) {
               
                //被代理者
                Person p = new Person();
       
                //代理者:代理对象
                ClassLoader loader = p.getClass().getClassLoader();
                Class<?>[] interfaces = p.getClass().getInterfaces();
               
                //创建InvocationHandler对象
                InvocationHandler ih = new MyHandler(p);
               
                //代理对象
                Object object = Proxy.newProxyInstance(loader, interfaces, ih);
                Animal myProxy = (Animal)object;
                //通过代理对象调用方法
                myProxy.eat();
                myProxy.sleep(3);
                String sport = myProxy.sport();
                System.out.println(sport);
        }
}

0 个回复

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