java动态代理

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()方法的调用
        
        
    }
}

 

posted @ 2017-11-26 10:59  这波操作怎么说  阅读(469)  评论(0编辑  收藏  举报