首页 > 编程语言 >java反射之-InvocationHandler使用

java反射之-InvocationHandler使用

时间:2023-06-26 10:14:34浏览次数:45  
标签:反射 调用 java Object MyInterface InvocationHandler 方法 MyInvocationHandler

InvocationHandler 是 Java 中的一个接口,是 Java 反射 API 的一部分。与 Proxy 类一起使用,用于动态创建接口的代理实例。

在 Java 中使用 Proxy 类创建代理对象时,需要提供一个 InvocationHandler 实现来定义代理对象的行为。InvocationHandler 接口只有一个方法,即 invoke() 方法,它负责处理对代理对象的方法调用。

下面是 InvocationHandler 的使用示例:

 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3 import java.lang.reflect.Proxy;
 4 
 5 public class MyInvocationHandler implements InvocationHandler {
 6     private Object target;
 7 
 8     public MyInvocationHandler(Object target) {
 9         this.target = target;
10     }
11 
12     @Override
13     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
14         // 在方法调用之前执行一些操作
15         System.out.println("方法调用前");
16 
17         // 调用目标对象上的方法
18         Object result = method.invoke(target, args);
19 
20         // 在方法调用之后执行一些操作
21         System.out.println("方法调用后");
22 
23         return result;
24     }
25 
26     public static void main(String[] args) {
27         // 创建目标对象
28         MyInterface targetObject = new MyInterfaceImpl();
29 
30         // 创建代理对象
31         MyInterface proxyObject = (MyInterface) Proxy.newProxyInstance(
32                 MyInterface.class.getClassLoader(),
33                 new Class<?>[]{MyInterface.class},
34                 new MyInvocationHandler(targetObject)
35         );
36 
37         // 在代理对象上调用方法
38         proxyObject.someMethod();
39     }
40 }
41 
42 interface MyInterface {
43     void someMethod();
44 }
45 
46 class MyInterfaceImpl implements MyInterface {
47     @Override
48     public void someMethod() {
49         System.out.println("执行 someMethod");
50     }
51 }

 

在这个示例中,MyInvocationHandler 类实现了 InvocationHandler 接口。它在构造函数中接收一个目标对象 (MyInterfaceImpl),在 invoke() 方法中,在调用目标对象上的方法之前和之后执行一些操作。

main() 方法中,使用 Proxy.newProxyInstance() 方法创建了一个代理对象,传递了 MyInterface 类加载器、接口数组(在此例中是 MyInterface),以及 MyInvocationHandler 的实例。当在代理对象上调用 someMethod() 方法时,将调用 MyInvocationHandlerinvoke() 方法,允许你拦截并在目标对象上的方法执行之前和之后执行其他操作。

--来自chatgpt

标签:反射,调用,java,Object,MyInterface,InvocationHandler,方法,MyInvocationHandler
From: https://www.cnblogs.com/little-bean-sprout/p/17504602.html

相关文章

  • JavaScript1.8.5新特性系列Object.keys
    以前在js-object这个分类里面也写过keys相关的api 在JavaScript1.8.5中,加入了原生的Object.keys这个api  Object.keys(obj);/*简单举例*/Object.keys({"A":"a","B":"b"});//["A","B"]兼容性写法:  if(!Object.keys){Object.keys=......
  • [转]Java如何对一个对象进行深拷贝
    介绍在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。而深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。如下图描述:了解了浅拷......
  • Java学习笔记(十六)
    1.什么是线程?线程是指操作系统中的一种执行单元,它是进程中的一部分,可以看作是轻量级的进程。与进程不同的是,线程共享同一进程的地址空间和系统资源,如打开文件和信号处理等,但每个线程都有自己的程序计数器(PC)和栈,用于执行代码和存储局部变量等数据。2。线程和进程有什么区别?线......
  • JAVA方法
    java方法原子性​​publicstaticintmax(intnum1,intnum2){  intresult=0;//初始化  if(num1==num2){    System.out.println("num1==num2");    return0;//终止方法 }  if(num1>num2){    result=num1; }else{   ......
  • 6月25日java学习日记
    端午节小休息了几天,断开连接了几天,希望快速状态回到吧,今天了解了部分java异常类,Exceptions类为异常类,学习了throw关键字,以及了解了trycatch的用法(基本与C#相同),同时使用HasgMap以及List.of方法实现了斗地主案例。 ......
  • 学习Java前的一些介绍
    1.java开发环境搭建卸载:删除Java的安装目录删除JAVA_HOME删除path下关于java的目录java-version验证安装:创建jdk和jre两个目录(还可以创建一个code目录存放代码)百度搜索jdk(建议安装jdk8)同意协议,找到对应版本并且下载双击安装jdk配置环境变量我......
  • springboot中自定义JavaBean返回的json对象属性名称大写变小写问题
    目录一、继承类二、手动添加Get方法三、@JsonProperty四、spring-bootjson(jackson)属性命名策略开发过程中发现查询返回的数据出现自定义的JavaBean的属性值大小写格式出现问题,导致前端无法接受到数据,目前有四种解决方法,根据大佬的经验之谈,前两种是最简单便捷的,后两种是比较通......
  • ActiveX 控件在过去是非常流行的技术,但近年来已经逐渐被其他技术所取代。由于其局限性
    ActiveX控件是一种可重用的软件组件,它们基于微软的COM(ComponentObjectModel)技术,并被广泛应用于Windows平台上的应用程序开发。ActiveX控件可以包含图形用户界面元素、功能模块、数据处理等,并提供给其他应用程序使用。下面是关于ActiveX控件的一些常见信息:安装和注册:使用A......
  • Java基础-Day02
    Java基础-Day02运算符算法运算符​赋值运算符shorts1=10;s1=s1+2;//编译失败s1+=2;//编译成功,结论:不会改变变量本身的数据类型(推荐使用)比较运算符特别说明:比较运算符的结果是boolean类型<,>,<=,>=,!=:只能使用在数值类型的数据之间==......
  • 如何在 Windows 10 上安装 Java JDK 17
    第1步:转到以下网站Java17链接第2步:双击下载的exe文件转到系统变量然后点击路径点击编辑按钮......