入门jdk动态代理

前提知识点:

1、反射,Method类,表示方法。类中的方法,通过Method可以执行某个方法。
反射机制反射机制

2、jdk动态代理的实现
反射包 java.lang.reflect ,里面有三个类:InvocationHandler,Method,Proxy。
1)InvocationHandler 接口 (调用处理器):就一个方法invoke()

invoke() 调用 : 表示

方法原型:
参数:Object proxy :jdk创建的代理对象,无需赋值。
Method method : 目标类中的方法,jdk提供Method
Object[] args : 目标类中方法的参数,jdk提供

public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

怎么用:1.创建类实现的接口 InvocationHandler (这个接口表示你的代理要干什么)
2.重写 invoke方法,把原来静态代理中代理类要完成的功能,写在这里。

2)Method 类:表示方法的,目标类中的方法
作用:通过Method执行某个目标类的方法,method.invoke();
说明: method.invoke() 就是用来执行目标方法的,等同于静态代理中的

3)Proxy类:核心的对象,创建代理对象。

举个例子:

package com.money.provider;

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

/**
 * Author:     money
 * Description:  TODO
 * Date:    2024/6/15 22:07
 * Version:    1.0
 */

public class ServiceProxy implements InvocationHandler {

    private Object object;

    public ServiceProxy(Object o){
        object = o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("进入代理对象类");
//        调用这个代理对象的方法的时候走这里
        Object invoke = method.invoke(object, args);
        System.out.println(invoke);
        return invoke;
//        return null;
    }
}

package com.money.provider;

import com.money.common.domain.User;
import com.money.common.service.UserService;

import java.lang.reflect.Proxy;

/**
 * Author:     money
 * Description:  TODO
 * Date:    2024/6/15 22:09
 * Version:    1.0
 */

public class Test {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();

        UserService o = (UserService)Proxy.newProxyInstance(UserService.class.getClassLoader(),
                new Class[]{UserService.class},
                new ServiceProxy(userService)
        );
        System.out.println(o.getClass().getName());
        User user = new User();
        user.setName("money555");
        User user1 = o.getUser(user);
        System.out.println(user1.getName());
        System.out.println("结束");

    }
}

当程序调用o.getUser(user);时,底层是代理对象执行 ServiceProxy 中的 invoke 方法,并且会把调用的方法和方法参数传给 invoke方法,后者的 method.invoke(object,args) 是利用反射机制调用object的方法,参数是args,此操作返回值是操作对象方法的返回值。
最后的执行结果是:

jdk.proxy1.$Proxy0
进入代理对象类
用户名:money555
com.money.common.domain.User@50134894
money555
结束

生成的代理对象类是 jdk.proxy1.$Proxy0,代理调用getUser的时候就会进入到 ServiceProxy 的invoke方法之中。

这是简单的动态代理使用方法,底层逻辑后续会增出。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiyunt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值