java动态代理学习

有一个类A,我们不想直接调用A的方法,而想要通过类B来间接调用A的方法。这时候A就叫做被代理类或者委托类(委托了任务的类),而B叫做代理类。
看下面的代码

public class A
{
    public void method1()
    {
        System.out.println("A类的method1执行");
    }
}
public class B
{
    A a = new A();

    public void method1()
    {
        a.method1();
    }
}

这就是B代理了A,但是这是我们事先就编好的程序,所以叫做静态代理。有没有办法可以在程序运行的时候自动生成类似B的代理类呢,当然可以。java提供了自动生成代理类的类库,我们只需要会用,就可以自动生成代理类了,也就是动态代理,下面是使用动态代理的过程。
一、编写一个被代理类需要实现的接口

public interface AInterface
{
    public void method1();
}

二、被代理类实现这个接口

public class A implements AInterface
{
    public void method1()
    {
        System.out.println("A类的method1执行");
    }
}

三、实现 InvocationHandler 接口,他是连接被代理类和代理类的

public class InvocationHandlerImpl implements InvocationHandler
{
    private Object target;

    public InvocationHandlerImpl() {}

    //传入需要代理的对象实例
    public InvocationHandlerImpl(Object target) {
        this.target = target;
    }
    /**
     * proxy是代理类对象实例
     * method是代理类调用的被代理类接口中的方法
     * args是执行method传入的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable
    {
        System.out.println("开始代理前的操作。。。");
        Object obj = method.invoke(target);
        System.out.println("开始代理后的操作。。。");
        return obj;
    }
}

四、动态生成代理类

public class Main
{
    public static void main(String[] args)
    {
        InvocationHandlerImpl invocationHandler = new InvocationHandlerImpl(new A());
        //第一个参数是AInterface的类加载器
        //第二个参数是AInterface.class组成的Class数组
        //第三个是invocationHandler实例
        //这里动态生成A的代理类b
        AInterface b = (AInterface) Proxy.newProxyInstance(
                AInterface.class.getClassLoader(), 
                new Class[]{AInterface.class}, 
                invocationHandler);
        //b调用method1最终会调用A的method1
        b.method1();
    }
}

为了理解方便,我画了一个关系图
关系图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值