深入理解Java中的反射与动态代理

news/2024/10/6 19:43:04/文章来源:https://www.cnblogs.com/szk123456/p/18290393

深入理解Java中的反射与动态代理

大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

1. 反射介绍

在Java编程中,反射(Reflection)是指在运行时动态获取类的信息并操作类或对象的能力。Java的反射机制允许程序在运行时获取类的信息(例如类的方法、字段、注解等),并且可以动态调用对象的方法、构造对象或访问/修改字段。

1.1. 获取类信息

通过反射,我们可以获取类的信息,如类名、方法、字段等:

package cn.juwatech.reflection;import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) throws Exception {Class<?> clazz = Class.forName("cn.juwatech.reflection.ExampleClass");// 获取类名String className = clazz.getName();System.out.println("Class Name: " + className);// 获取所有方法Method[] methods = clazz.getDeclaredMethods();System.out.println("Methods:");for (Method method : methods) {System.out.println(method.getName());}// 创建对象实例Object instance = clazz.getDeclaredConstructor().newInstance();System.out.println("Instance created: " + instance);}
}

1.2. 调用方法与操作字段

通过反射,可以动态调用对象的方法和操作对象的字段:

package cn.juwatech.reflection;import java.lang.reflect.Field;
import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) throws Exception {Class<?> clazz = Class.forName("cn.juwatech.reflection.ExampleClass");// 获取方法并调用Method method = clazz.getDeclaredMethod("publicMethod", String.class);Object instance = clazz.getDeclaredConstructor().newInstance();method.invoke(instance, "Reflection Example");// 操作字段Field field = clazz.getDeclaredField("privateField");field.setAccessible(true); // 设置私有字段可访问field.set(instance, "Updated Value");System.out.println("Updated private field value: " + field.get(instance));}
}

2. 动态代理

动态代理是一种在运行时创建代理类和实例的技术,它允许我们创建一个实现了一组接口的代理类,并在代理类的方法执行时动态调用处理器(InvocationHandler)的方法。

2.1. 创建动态代理类

下面是一个示例,演示如何通过动态代理增强类的行为:

package cn.juwatech.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface ExampleInterface {void doSomething();
}class ExampleClass implements ExampleInterface {@Overridepublic void doSomething() {System.out.println("Doing something...");}
}public class DynamicProxyExample {public static void main(String[] args) {ExampleInterface realObject = new ExampleClass();ExampleInterface proxyObject = (ExampleInterface) Proxy.newProxyInstance(DynamicProxyExample.class.getClassLoader(),new Class[]{ExampleInterface.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method invocation");Object result = method.invoke(realObject, args);System.out.println("After method invocation");return result;}});proxyObject.doSomething();}
}

3. 总结

本文深入探讨了Java中的反射与动态代理机制,包括如何利用反射获取类信息、调用方法和操作字段,以及如何使用动态代理创建代理类并增强类的行为。通过这些示例,读者可以更好地理解和应用Java中强大的反射与动态代理特性。

微赚淘客系统3.0小编出品,必属精品,转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决网页打开加载缓慢问题

以我为例 今天打开B站发现很多视频打开之后一直是加载状态,加载半天也打不开,还有知乎跳转到csdn也无法正常打自己捣鼓的许久发现可以通过修改DNS来解决 首先打开此电脑→找到网络→右键点击属性→左上角更改适配器设置→选择你的网络双击→点击属性→找到Internet 协议版本4…

服务器开发——setsockopt函数

setsockopt() setsockopt() 是一个用于设置套接字选项的 Unix 系统调用。它允许程序员修改套接字的行为,以适应不同的网络环境和应用程序需求。 1. 函数介绍 函数原型: #include <sys/socket.h> /*** level:选项所在的协议层。例如,SOL_SOCKET 表示套接字层,IPPRO…

Python OpenCv对规则物体进行实时检测

很多情况需要对物体进行检测,常规的方法也有很多种。但是检测出来的边缘一般都是非常多,结果也是非常杂乱的,显然这种结果不是我们想要的。如果颜色相较于背景非常鲜艳的可以调节hsv阈值再进行检测,如果是一直在运动的物体可以通过帧差法进行物体检测,还有很多高深的算法也…

学习canvas(一些常用api)

当然,以下是这些常用Canvas API的总结,按照Markdown格式编写: 常用Canvas API总结 1. 获取绘图上下文 const canvas = document.getElementById(myCanvas); const ctx = canvas.getContext(2d); // 或 webgl2. 绘制矩形 ctx.fillStyle = blue; ctx.fillRect(10, 10, 150, 10…

uniapp 解决本地跨域问题

让每一滴智慧绘制成一条不归路!

UniVAE:基于Transformer的单模型、多尺度的VAE模型

大家都知道,Transformer的$\mathscr{O}(n^2)$复杂度是它的“硬伤”之一。不过凡事有弊亦有利,$\mathscr{O}(n^2)$的复杂度也为Transformer带来很大的折腾空间,我们可以灵活地定制不同的attention mask,来设计出不同用途的Transformer模型来,比如UniLM、K-BERT等。 本文介绍…

从变分编码、信息瓶颈到正态分布:论遗忘的重要性

这是一篇“散文”,我们来谈一下有着千丝万缕联系的三个东西:变分自编码器、信息瓶颈、正态分布。 众所周知,变分自编码器是一个很经典的生成模型,但实际上它有着超越生成模型的含义;而对于信息瓶颈,大家也许相对陌生一些,然而事实上信息瓶颈在去年也热闹了一阵子;至于正…

应用升级

本文是在你已经安装三个软件的基础上进行优化 一、卸载NFG Multi Crack软件(没有就不用管) 二、进入Lsposed软件 点击模块,可以看到已安装的两个模块1. 点击FL-Xposed,勾选以下应用,然后返回2. 点击HookVip,勾选Fakelocation,然后返回三、进入隐藏应用列表软件 1. 点击模…

哪些方法可以将word导出为pdf格式?

在日常工作和学习中,我们经常需要将Word文档转换为PDF格式,以便更好地保存、分享和打印文件。PDF格式具有跨平台兼容性好、不易被篡改等优点,因此得到了广泛应用。那么Word如何转PDF呢?本文将介绍三种实用的word转pdf的方法,帮助读者轻松实现文档格式的转换。 方法一:使用…

2024春秋杯 stdout

考点:文件,setvbuf缓冲区,ret2syscall,ret2csu 题目给了libc文件。 main函数和vlun函数存在明显的栈溢出 int __cdecl main(int argc, const char **argv, const char **envp) {char buf[80]; // [rsp+0h] [rbp-50h] BYREFinit(argc, argv, envp);puts("where is my s…

怎么看时序图

时序图看法 从上到下,从左到右 看一个单位时间,拆分成一个一个模块 简单的时序图,一根线串口通信SPIS时序图总体传输24个bit注意无效电平可能传输不同的电平

工程仪器振弦采集仪的设计与研发进展

工程仪器振弦采集仪的设计与研发进展 工程仪器振弦采集仪是一种用于测量和记录物体振动参数的仪器。它能够实时采集物体的振动信号,并通过内部的传感器将振动信号转化为电信号,然后进行信号放大和处理,最终以数字形式显示或存储。 河北稳控科技振弦采集仪的设计与研发进展主…