南昌做网站kaiu/房产网站建设

南昌做网站kaiu,房产网站建设,wordpress人机验证,创联互动建设网站小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…

  • 小程一言
  • 反射
    • 何为反射
    • 反射核心类
    • 反射的基本使用
      • 获取`Class`对象
      • 创建对象
      • 调用方法
      • 访问字段
    • 示例程序
    • 应用场景
    • 优缺点分析
      • 优点
      • 缺点
    • 注意
  • 再深入一些
    • 反射与泛型
    • 反射与注解
    • 反射与动态代理
    • 反射与类加载器
  • 结语

小程一言

本专栏是对Java知识点的总结。在学习Java的过程中,学习的笔记,加入自己的思考,结合各种资料的整理。

文章与程序一样,一定都是不完美的,因为不完美,才拥有不断追求完美的动力

以下是符合您要求的博客文章,主类名为crj,内容全面细致,深度适中,字数约5000字。

---

反射

Java反射是Java语言中一项强大的功能,它允许程序在运行时动态地获取类的信息并操作类的属性、方法和构造方法。反射机制为Java提供了极大的灵活性,广泛应用于框架开发、动态代理、注解处理等场景。本文将详细介绍Java反射的核心概念、使用方法以及注意事项,并通过示例代码帮助读者更好地理解。


何为反射

简单来说,反射是指在程序运行时,能够动态地获取类的信息(如类名、方法、字段、构造方法等),并能够操作这些信息。通过反射,我们可以在运行时创建对象、调用方法、访问字段,甚至修改私有成员的值。

反射的核心类是java.lang.reflect包中的ClassMethodFieldConstructor。通过这些类,我们可以实现动态编程。

在这里插入图片描述

反射核心类

  1. Class<T>: 表示一个类或接口的类型信息。通过Class对象可以获取类的构造方法、方法和字段。
  2. Constructor<T>: 表示类的构造方法,用于创建对象。
  3. Method: 表示类的方法,用于调用方法。
  4. Field: 表示类的字段,用于访问或修改字段的值。

反射的基本使用

获取Class对象

要使用反射,首先需要获取目标类的Class对象。以下是三种常见的获取方式:

  • Class.forName("全限定类名"): 通过类的全限定名获取Class对象。
  • 对象.getClass(): 通过对象实例获取Class对象。
  • 类名.class: 直接通过类名获取Class对象。
// 示例:获取String类的Class对象
Class<?> clazz = Class.forName("java.lang.String");

创建对象

通过Class对象可以获取类的构造方法,并调用newInstance()方法创建对象。

// 示例:通过反射创建String对象
Class<?> clazz = Class.forName("java.lang.String");
Constructor<?> constructor = clazz.getConstructor(); // 获取无参构造方法
Object obj = constructor.newInstance(); // 创建对象
System.out.println("创建的对象: " + obj);

调用方法

通过Class对象可以获取类的方法,并调用invoke()方法执行方法。

// 示例:通过反射调用String的length()方法
Class<?> clazz = Class.forName("java.lang.String");
Method method = clazz.getMethod("length"); // 获取length()方法
int length = (int) method.invoke("Hello"); // 调用方法
System.out.println("字符串长度: " + length);

访问字段

通过Class对象可以获取类的字段,并访问或修改字段的值。

// 示例:通过反射访问Integer的value字段
Class<?> clazz = Class.forName("java.lang.Integer");
Field field = clazz.getDeclaredField("value"); // 获取value字段
field.setAccessible(true); // 设置可访问私有字段
int value = (int) field.get(10); // 获取字段值
System.out.println("字段值: " + value);

在这里插入图片描述

示例程序

以下是一个完整的示例程序,展示了如何使用反射创建对象、调用方法和访问字段。

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class crj {public static void main(String[] args) {try {// 1. 获取Class对象Class<?> clazz = Class.forName("java.lang.String");// 2. 创建对象Constructor<?> constructor = clazz.getConstructor();Object obj = constructor.newInstance();System.out.println("创建的对象: " + obj);// 3. 调用方法Method method = clazz.getMethod("length");int length = (int) method.invoke("Hello");System.out.println("字符串长度: " + length);// 4. 访问字段Class<?> integerClass = Class.forName("java.lang.Integer");Field field = integerClass.getDeclaredField("value");field.setAccessible(true);int value = (int) field.get(10);System.out.println("Integer的value字段值: " + value);} catch (Exception e) {e.printStackTrace();}}
}

应用场景

  1. 动态代理: 在运行时创建代理对象,例如Spring AOP。
  2. 框架开发: 如Spring通过反射管理Bean的生命周期。
  3. 注解处理: 在运行时读取注解信息,例如JUnit的测试框架。
  4. 工具开发: 如IDE的代码提示功能。

优缺点分析

优点

  • 灵活性高: 可以在运行时动态操作类和方法。
  • 功能强大: 适用于框架和工具开发。

缺点

  • 性能较低: 反射操作比直接调用慢。
  • 破坏封装性: 可以访问私有成员,可能导致安全问题。
  • 代码可读性差: 反射代码通常难以理解和维护。

注意

  1. 性能问题: 反射操作较慢,频繁使用时需谨慎。
  2. 安全性: 反射可以绕过访问控制,需确保代码的安全性。
  3. 异常处理: 反射操作可能抛出IllegalAccessExceptionInvocationTargetException等异常,需妥善处理。

在这里插入图片描述

再深入一些

将能联系到的地方都牵连一下,希望能给你更多的思考

反射与泛型

Java反射机制在处理泛型时需要注意类型擦除的问题。由于Java的泛型是通过类型擦除实现的,因此在运行时无法直接获取泛型的具体类型信息。但是,可以通过ParameterizedType等接口来获取泛型的信息。

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;public class crj{public static class GenericClass<T> {public void printType() {Type type = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];System.out.println("泛型类型: " + type);}}public static void main(String[] args) {GenericClass<String> genericClass = new GenericClass<String>() {};genericClass.printType();}
}

反射与注解

Java反射机制可以用于读取和处理注解。通过反射,我们可以在运行时获取类、方法、字段上的注解信息,并根据注解的值执行相应的逻辑。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {String value();
}public class AnnotationReflectionExample {@MyAnnotation("Hello, Annotation!")public void annotatedMethod() {System.out.println("这是一个带有注解的方法");}public static void main(String[] args) throws Exception {Method method = AnnotationReflectionExample.class.getMethod("annotatedMethod");MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println("注解值: " + annotation.value());}
}

在这里插入图片描述

反射与动态代理

Java反射机制在动态代理中扮演着重要角色。通过Proxy类和InvocationHandler接口,我们可以在运行时创建代理对象,并在调用方法时执行额外的逻辑。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface MyInterface {void doSomething();
}public class DynamicProxyExample {public static void main(String[] args) {MyInterface realObject = new MyInterface() {@Overridepublic void doSomething() {System.out.println("真实对象的方法");}};MyInterface proxyObject = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(),new Class<?>[] { MyInterface.class },new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("方法调用前");Object result = method.invoke(realObject, args);System.out.println("方法调用后");return result;}});proxyObject.doSomething();}
}

反射与类加载器

Java反射机制与类加载器密切相关。通过自定义类加载器,我们可以在运行时动态加载类,并使用反射机制操作这些类。

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;public class CustomClassLoader extends ClassLoader {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = loadClassData(name);return defineClass(name, classData, 0, classData.length);}private byte[] loadClassData(String className) {InputStream inputStream = getClass().getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();int bufferSize = 4096;byte[] buffer = new byte[bufferSize];int bytesRead;try {while ((bytesRead = inputStream.read(buffer)) != -1) {byteArrayOutputStream.write(buffer, 0, bytesRead);}} catch (Exception e) {e.printStackTrace();}return byteArrayOutputStream.toByteArray();}public static void main(String[] args) throws Exception {CustomClassLoader customClassLoader = new CustomClassLoader();Class<?> clazz = customClassLoader.loadClass("com.example.MyClass");Object obj = clazz.getDeclaredConstructor().newInstance();Method method = clazz.getMethod("myMethod");method.invoke(obj);}
}

在这里插入图片描述

结语

Java反射是一项强大的功能,它为Java提供了动态编程的能力。通过反射,我们可以在运行时获取类的信息并操作类的成员。尽管反射具有很高的灵活性,但也存在性能和安全性的问题。在实际开发中,应根据需求合理使用反射,避免滥用。

希望本文能帮助你更好地理解Java反射机制!如果你有任何问题或建议,欢迎在评论区留言。

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

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

相关文章

【算法与数据结构】并查集详解+题目

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…

C语言简单练习题

文章目录 练习题一、计算n的阶乘bool类型 二、计算1!2!3!...10!三、计算数组arr中的元素个数二分法查找 四、动态打印字符Sleep()ms延时函数system("cls")清屏函数 五、模拟用户登录strcmp()函数 六、猜数字小游戏产生一个随机数randsrandRAND_MAX时间戳time() 示例 …

ShenNiusModularity项目源码学习(8:数据库操作)

ShenNiusModularity项目使用SqlSugar操作数据库。在ShenNius.Repository项目中定义了ServiceCollectionExtensions.AddSqlsugarSetup函数注册SqlSugar服务&#xff0c;并在ShenNius.Admin.API项目的ShenniusAdminApiModule.OnConfigureServices函数中调用&#xff0c;SqlSugar所…

MATLAB图像处理:图像特征概念及提取方法HOG、SIFT

图像特征是计算机视觉中用于描述图像内容的关键信息&#xff0c;其提取质量直接影响后续的目标检测、分类和匹配等任务性能。本文将系统解析 全局与局部特征的核心概念&#xff0c;深入讲解 HOG&#xff08;方向梯度直方图&#xff09;与SIFT&#xff08;尺度不变特征变换&…

小白win10安装并配置yt-dlp

需要yt-dlp和ffmpeg 注意存放路径最好都是全英文 win10安装并配置yt-dlp 一、下载1.下载yt-dlp2. fffmpeg下载 二、配置环境三、cmd操作四、yt-dlp下视频操作 一、下载 1.下载yt-dlp yt-dlp地址 找到win的压缩包点下载&#xff0c;并解压 2. fffmpeg下载 ffmpeg官方下载 …

【技术解析】MultiPatchFormer:多尺度时间序列预测的全新突破

今天给我大家带来一篇最新的时间序列预测论文——MultiPatchFormer。这篇论文提出了一种基于Transformer的创新模型&#xff0c;旨在解决时间序列预测中的关键挑战&#xff0c;特别是在处理多尺度时间依赖性和复杂通道间相关性时的难题。MultiPatchFormer通过引入一维卷积技术&…

145,【5】 buuctf web [GWCTF 2019]mypassword

进入靶场 修改了url后才到了注册页面 注测后再登录 查看源码 都点进去看看 有个反馈页面 再查看源码 又有收获 // 检查$feedback是否为数组 if (is_array($feedback)) {// 如果是数组&#xff0c;弹出提示框提示反馈不合法echo "<script>alert(反馈不合法);<…

晶闸管主要参数分析与损耗计算

1. 主要参数 断态正向可重复峰值电压 :是晶闸管在不损坏的情况下能够承受的正向最大阻断电压。断态正向不可重复峰值电压 :是晶闸管只有一次可以超过的正向最大阻断电压,一旦晶闸管超过此值就会损坏,一般情况下 反向可重复峰值电压 :是指晶闸管在不损坏的情况下能够承受的…

el-select 设置宽度 没效果

想实现下面的效果&#xff0c;一行两个&#xff0c;充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因&#xff1a; el-form 添加了 inline 所以删除inline属性 即可

一款利器提升 StarRocks 表结构设计效率

CloudDM 个人版是一款数据库数据管理客户端工具&#xff0c;支持 StarRocks 可视化建表&#xff0c;创建表时可选择分桶、配置数据模型。目前版本持续更新&#xff0c;在修改 StarRocks 表结构方面进一步优化&#xff0c;大幅提升 StarRocks 表结构设计效率。当前 CloudDM 个人…

数量5 - 平面图形、立体几何

目录 一、平面几何问题1.三角形2.其他图形二、立体几何与特殊几何1.表面积2.体积3.等比放缩(简单)4.几何最值(简单)5.最短路径一、平面几何问题 平面图形: 立体图形: 1.三角形 特殊直角

CAS单点登录(第7版)7.授权

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 授权 概述 授权和访问管理 可以使用以下策略实施授权策略以保护 CAS 中的应用程序和依赖方。 服务访问策略 服务访问策略允许您定义授权和访问策略&#xff0c;以控制对向 CAS 注册的…

53倍性能提升!TiDB 全局索引如何优化分区表查询?

作者&#xff1a; Defined2014 原文来源&#xff1a; https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中&#xff0c;全局索引是一种定义在分区表上的索引类型&#xff0c;它允许索引分区与表分区之间建立一对多的映射关系&#xff0c;即一个索引分区可以对…

I.MX6ull-I2C

一,I2C总线介绍 I2C(Inter-Integrated Circuit 集成电路)总线是Philips公司在八十年代初推出的一种串行、半双工的总 线&#xff0c;主要用于近距离、低速的芯片之间的通信&#xff1b;I2C总线有两根双向的信号线&#xff0c;一根数据线SDA用于收 发数据&#xff0c;一根时钟线…

书籍推荐:《书法课》林曦

记得樊登老师说过&#xff0c;如果你想了解一个事物&#xff0c;就去读5本相关的书&#xff0c;你会比大部分人都更了解它。这是我读的第4本和“书法”有关的书&#xff0c;作为一个零基础的成年人&#xff0c;林曦这本《书法课》非常值得一读。&#xff08;无论你是否写字&…

【大疆无人机地图测绘技术学习:高精度、高效率的全流程解决方案】

文章目录 大疆无人机地图测绘算法详解一、数据采集&#xff08;一&#xff09;飞行平台与传感器&#xff08;二&#xff09;航线规划&#xff08;三&#xff09;数据类型 二、数据处理与建模&#xff08;一&#xff09;数据导入与预处理&#xff08;二&#xff09;空三计算&…

工具资料+H3C 交换机常见故障分析排查+高危操作

当我们从客户那里接到一个故障时,我们根据现象让客户收集一堆信息,然后集成商、代理商、设备厂家一级一级的反复咨询与确认,天天经历这样的场景。几乎每个故障我们都要经过多个层级的人处理,信息的交流占据了每个人大部分的时间,反复的收集信息与确认问题现象也会让客户不厌其烦…

STM32:USB 虚拟串口以及使用usb->dfu进行iap

本文介绍stm32上usb的常用功能虚拟串口和DFU(Download Firmware Update) 文章目录 前言一、usb二、虚拟串口1.cubemx配置1.我们选用高速usb&#xff0c;然后选择内部低速的phy&#xff0c;这样使用的usb&#xff0c;最高速度为12Mbit每秒。2.USB_DEVICE cdc类配置3.时钟配置&am…

HCIA项目实践--静态路由的综合实验

八 静态路由综合实验 &#xff08;1&#xff09;划分网段 # 192.168.1.0 24#分析&#xff1a;每个路由器存在两个环回接口&#xff0c;可以把两个环回接口分配一个环回地址&#xff0c;所以是四个环回&#xff0c;一个骨干&#xff0c;这样分配&#xff0c;不会出现路由黑洞#19…

通过内网穿透ssh实现远程对家里的linux进行终端操作和编程

内网穿透就是将自己的地址当穿透到公网ip&#xff0c;这一就可以在外网访问了(因为大部分人ip都是动态分配的)&#xff0c;以适用ssh远程连接&#xff0c;我这里用的是极点云cpolar&#xff0c;反正也是黑框编程&#xff0c;免费就行了。我是ubuntu虚拟机&#xff0c;在虚拟机上…