前提知识点:
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方法之中。
这是简单的动态代理使用方法,底层逻辑后续会增出。
标签:入门,invoke,money,Object,代理,jdk,方法,Method From: https://blog.csdn.net/m0_56017200/article/details/139712719