ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

jdk动态代理中invoke的return返回的值有什么用?

2026/9/24 2:01:03 拓冰建站 浏览量
jdk动态代理中invoke的return返回的值有什么用?

目录

  • 首先在接口中定义一个行为
  • 再定义一个目标角色实现接口,实现行为
  • 去代理角色类中解决一下报错,但是什么都不要写

invoke的return返回的值是调用方法中返回的值
下面我们来实例看一下

首先在接口中定义一个行为

public String toMarry02();

再定义一个目标角色实现接口,实现行为

注意这里return了一个字符串hi

@Overridepublic String toMarry02(){System.out.println("二婚");return "hi";}

去代理角色类中解决一下报错,但是什么都不要写

@Overridepublic String toMarry02() {return null;}

这个时候在获取代理对象的invoke方法中return null,不要return object

package com.svt.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** JDK动态代理类*      每一个代理类都需要实现InvocationHandler接口*/
public class JdkHandler implements InvocationHandler {//目标对象private Object target;//类型不固定,创建时动态生成//通过带参构造器传递目标对象public JdkHandler(Object target) {this.target = target;}/*** 1.调用目标对象的方法(返回object)* 2.增强目标对象的行为** @param proxy 调用该方法的代理实例* @param method 目标对象的方法* @param args 目标对象的方法所需要的参数* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//前后都可能会有增强行为,不一定都要有,只是可能会有//用户的增强行为System.out.println("============方法执行前");// 调用目标对象中的方法(返回object)Object object=method.invoke(target,args);//用户的增强行为System.out.println("方法执行后============");return null;//调用方法中返回的值}/*** 获取代理对象* public static Object newProxyInstance(ClassLoader loader,*                                       Class<?>[] interfaces,*                                       InvocationHandler h)*  Loader:类加载器*  interfaces:接口数组*      target.getClass().getInterfaces():目标对象的接口数组*  h:InvocationHandler接口(传入InvocationHandler接口的实现类)* @return*/public Object getProxy(){Object object= Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);return object;}
}

在测试类中进行测试

public class JdkHandlerTest {public static void main(String[] args) {//目标对象You you = new You();//得到代理类JdkHandler jdkHandler = new JdkHandler(you);//得到代理对象Marry marry = (Marry) jdkHandler.getProxy();//通过代理对象调用目标对象的方法String msg = marry.toMarry02();System.out.println(msg);}
}

得到的结果是初始化了,但是没有返回值,因为我们将invoke中的返回值写成了null,所以不管在目标角色里写多少返回值都不会出现在控制台
在这里插入图片描述
这个时候我们只要将获取代理对象的invoke方法中return null改为return object,就能将结果呈现在控制台
在这里插入图片描述
这就是获取代理对象的invoke方法中return object的用处,最好写成return object哦!