java反射(7) 动态代理

  1. 动态代理就是将一个对象调用方法时,将这些方法都转成指定InvocationHandle的invoke方法来执行
  2. 以下为代码,具体讲解穿插在代码中
    //这个程序在p对象执行两个方法的时候都将方法转化成了invoke方法来执行
    package Chapter_5;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    interface Person{
        void talk();
        void sayHello(String name);
    }
    
    class MyInvocationHandler implements InvocationHandler{
    
    /*当执行动态代理对象的所有方法的时候,都会被替换成下面的invoke方法,
    * 其中:
    *   proxy:正在动态代理的对象
    *   method:正在执行的方法
    *   args:代表目标方法的参数
    *   */
    
    
        public Object invoke(Object proxy, Method method, Object[] args){
            System.out.println("----正在执行的方法:" + method);
            if (args != null){
                System.out.println("下面是执行该方法时传入的实参: ");
                for(Object val : args){
                    System.out.println(val);
                }
            }else {
                System.out.println("调用该方法没有实参!");
            }
            return null;
        }
    }
    
    
    public class ProxyTest {
        public static void main(String args[]){
    
            InvocationHandler handler = new MyInvocationHandler();
    //        创建一个InvocationHandler(调用句柄)对象
    
    
            Person p = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
                    new Class[]{Person.class}, handler);
    //        使用指定的InvocationHandler对象来生成一个动态代理对象
    
            p.talk();
            p.sayHello("jaja");
        }
    }
    
    //执行程序,看到输出
    //        ----正在执行的方法:public abstract void Chapter_5.Person.talk()
    //        调用该方法没有实参!
    //        ----正在执行的方法:public abstract void Chapter_5.Person.sayHello(java.lang.String)
    //        下面是执行该方法时传入的实参:
    //        jaja

    这是我看李刚编著的《疯狂Java讲义》后总结出来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值