Java动态代理

本文介绍了动态代理模式中的目标对象、代理对象概念,重点讲解了ProxyFactory的使用,尤其是如何通过InvocationHandler接口实现代理对象对目标对象方法的调用。通过实例展示了如何创建并测试动态代理对象。
摘要由CSDN通过智能技术生成

动态代理

1.1目标对象和代理对象

在代理模式中,有目标对象代理对象

1.1.1目标对象

目标对象指的实际上就是真正实现方法逻辑的对象,比如现在有房东,租客,中介三个人,目标对象指的就是房东,或者说是租客,因为房东或者租客才是真正实现的房屋租赁的人。

1.1.2代理对象

代理对象很好理解,代理对象实际上指的就是中介,房东通过中介这个代理对象联系到了租客这个目标对象,或者说租客通过中介联系到了房东。

1.2代理对象工厂(ProxyFactory)

代理对象工厂(ProxyFactory)就像是中介公司,通过中介公司催生出了中介这个代理对象,ProxyFactory的作用实际上就是生成一个代理对象。

在ProxyFactory中有一个方法getProxy()

public Object getProxy()

通过这个方法来获得代理对象,然后通过代理对象调用目标对象的方法来实现业务逻辑

通过Proxy类中的实例化对象方法实例化代理对象

return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
1.3实现InvocationHandler()接口

在getProxy()方法中需要实现InvocationHandler接口

通过实现InvocationHandler接口内的invoke()方法,来获得代理对象调用的Method对象以及参数,并且通过这个Method对象来调用目标对象的方法

InvocationHandler invocationHandler = new InvocationHandler() {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;//被调用方法的返回值

        System.out.println("调用前");
        result=method.invoke(target,args);
        System.out.println("调用后");

        return result;
    }
1.4测试
@Test
public void proxyTest(){
    ProxyFactory proxyFactory=new ProxyFactory(new CalculatorImpl());
    Calculator proxy = (Calculator) proxyFactory.getProxy();
    System.out.println(proxy.add(1, 2));
}

控制台打印

调用前
方法内部 result = 3
调用后
3

1.5ProxyFactory代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;//被调用方法的返回值

                System.out.println("调用前");
                result=method.invoke(target,args);
                System.out.println("调用后");

                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值