码迷,mamicode.com
首页 > 编程语言 > 详细

java动态代理

时间:2017-11-26 12:44:25      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:row   方法   throwable   getc   als   instance   test   rri   throw   

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

//动态代理的使用
interface Subject {
    void action();
}

// 被代理类
class RealSubject implements Subject {

    @Override
    public void action() {
        System.out.println("我是被代理类,我一定要被执行!");
    }

}

// 代理类
class MyInvocationHandler implements InvocationHandler {

    Object object; // 实现了接口的被代理类的对象的声明

    // ①给被代理的对象实例化②返回一个代理类的对象
    public Object blind(Object obj) {
        this.object = obj;
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),
                object.getClass().getInterfaces(), this);
    }
    
    //当通过代理类的对象发起对重写的方法的调用时,都会转为对如下的invoke方法的调用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //method方法的返回值是returnVal
        Object returnVal = method.invoke(object, args);
        return returnVal;
    }

}

public class TestProxy {
    public static void main(String[] args) {
        //1.被代理的对象
        RealSubject real = new RealSubject();
        //2.创建一个实现了InvocationHandler接口类的对象
        MyInvocationHandler handler =new MyInvocationHandler();
        //3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
        Object obj = handler.blind(real);
        Subject sub = (Subject)obj; //此时sub就是代理类的对象
        sub.action();//转到对InvacationHandler接口的实现类的invoke()方法的调用
        
        
    }
}

 

java动态代理

标签:row   方法   throwable   getc   als   instance   test   rri   throw   

原文地址:http://www.cnblogs.com/wxf-com/p/7898482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!