Java反射机制详解

WSL2 Ubuntu复现FoundationPose项目(docker) 复现一个基于深度学习的物体姿态估计框架FoundationPose项目,使用docker,WSL2 阅读详情

一、什么是反射

反射(Reflection)​ 是Java语言的一个重要特性,它允许程序在运行时动态地获取、访问类的所有信息。

本质:JVM在加载.class文件时,会在堆内存中生成一个唯一的Class对象,这个对象包含了类的所有元数据(属性、方法、构造方法等)。反射正是通过操作这些元数据来突破编译期的语法检查限制。

二、Class类

1. 是什么?

Class对象是类的"说明书",是反射机制的根源。每个类在JVM中都有且只有一个Class对象。

2. 获得Class对象的三种方式

// 方式1:通过类名.class
Class<User> clazz1 = User.class;

// 方式2:通过对象.getClass()
User user = new User();
Class<? extends User> clazz2 = user.getClass();

// 方式3:通过Class.forName("全类名")
Class<?> clazz3 = Class.forName("com.example.User");

三、Constructor类

1. 是什么?

描述构造方法的类,通过它可以创建类的实例。

2. 获得Constructor对象的方法

Class<User> clazz = User.class;

// 获取所有公共构造方法
Constructor<?>[] publicConstructors = clazz.getConstructors();

// 获取所有构造方法(包括私有)
Constructor<?>[] allConstructors = clazz.getDeclaredConstructors();

// 获取指定公共构造方法
Constructor<User> publicConstructor = clazz.getConstructor(String.class, int.class);

// 获取指定构造方法(包括私有)
Constructor<User> privateConstructor = clazz.getDeclaredConstructor(String.class);

3. 常用方法

// 创建实例
Constructor<User> constructor = clazz.getConstructor(String.class, int.class);
User user = constructor.newInstance("张三", 25);

// 访问私有构造方法
Constructor<User> privateConstructor = clazz.getDeclaredConstructor(String.class);
privateConstructor.setAccessible(true);  // 设置可访问
User privateUser = privateConstructor.newInstance("私有构造");

四、Field类

1. 是什么?

描述属性的类,通过它可以读取、修改属性的值。

2. 获得Field对象的方法

// 获取所有公共成员变量
Field[] publicFields = clazz.getFields();

// 获取所有成员变量
Field[] allFields = clazz.getDeclaredFields();

// 获取指定公共成员变量
Field publicField = clazz.getField("publicFieldName");

// 获取指定成员变量
Field privateField = clazz.getDeclaredField("privateFieldName");

3. 常用方法

User user = new User();

// 获取字段值
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
Object value = nameField.get(user);

// 设置字段值
Field ageField = clazz.getDeclaredField("age");
ageField.setAccessible(true);
ageField.set(user, 30);

五、Method类

1. 是什么?

描述方法的类,通过它可以调用方法。

2. 获得Method对象的方法

// 获取所有公共方法
Method[] publicMethods = clazz.getMethods();

// 获取所有方法
Method[] allMethods = clazz.getDeclaredMethods();

// 获取指定公共方法
Method publicMethod = clazz.getMethod("methodName", String.class, int.class);

// 获取指定方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod", String.class);

3. 常用方法

User user = new User();

// 调用公共方法
Method publicMethod = clazz.getMethod("publicMethod", String.class);
Object result1 = publicMethod.invoke(user, "参数");

// 调用私有方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod", String.class);
privateMethod.setAccessible(true);
Object result2 = privateMethod.invoke(user, "私有方法参数");

六、Annotation类

1. 是什么?

描述注解的类,通过它可以判断某个元素是否添加了注解、读取注解的属性值。

2. 获得Annotation对象的方法

// 获取类上的所有注解
Annotation[] classAnnotations = clazz.getAnnotations();

// 获取类上的所有注解(包括继承的)
Annotation[] declaredClassAnnotations = clazz.getDeclaredAnnotations();

// 获取方法上的指定注解
Method method = clazz.getMethod("testMethod");
Annotation methodAnnotation = method.getAnnotation(MyAnnotation.class);

3. 常用方法

// 判断是否包含指定注解
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
    // 获取注解实例
    MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
    
    // 读取注解属性值
    String value = annotation.value();
    int number = annotation.number();
}

反射应用场景

  1. 框架开发:Spring、MyBatis等框架大量使用反射

  2. 动态代理:AOP编程的基础

  3. 注解处理器:编译时和运行时的注解处理

  4. 序列化和反序列化:JSON、XML等数据格式的转换

  5. 单元测试:测试私有方法

注意事项

  1. 性能问题:反射操作比直接调用慢,频繁使用需考虑性能

  2. 安全问题:反射可以突破封装性,需要谨慎使用

  3. 可维护性:过度使用反射会降低代码的可读性和可维护性

反射是Java语言强大灵活性的体现,合理使用可以大大提高程序的灵活性和扩展性,但也要注意其带来的性能开销和安全隐患。

第38节:cesium 风场效果(含源码+视频) cesium 风场效果 阅读详情

相关推荐

通过python下载西门子技术中心文档

本篇文章纯粹记录如何下载通过python下载西门子技术中心文档,所下载文档完全自己学习使用,非商业用途

John_09040211的博客 561

Java之反射机制详解

Java反射是一种允许程序在运行时动态检查和操作类内部信息的机制,提供了极大的灵活性和扩展性。它通过`java.lang.reflect`包中的类实现,包括Class、Constructor、Field和Method等核心类。反射机制的应用场景广泛,如框架设计、插件系统、单元测试等。具体实现包括获取Class对象、获取类的信息以及操作类,如创建对象、调用方法和访问字段。此外,反射在处理注解方面也起着关键作用。然而,反射存在性能开销和安全隐患,因此需要谨慎使用,并采取相应的优化和安全措施。

一个老Java开发的自白 1576

车辆贷款违约预测挑战赛

2021科大讯飞-车辆贷款违约预测挑战赛--方案简介车贷违约预测问题,目的是建立风险识别模型来预测可能违约的借款人。预测结果为借款人是否可能违约,属于二分类问题。偏数据挖掘的比赛,关键点是如何基于对数据的理解抽象归纳出有用的特征。站在大佬的视角,尝试学习总结,站在巨人的肩膀上,也许看得会更远一些。直接进入主题,开始学习套路,芜湖~特征工程1、常用库、数据导入import pandas as pd import numpy as np import lightgbm as lgb import xgboost

平平淡淡,戒急用忍,一生学闭嘴。 3341

java反射机制原理详解_反射机制使用详解

原文链接:反射机制使用详解反射机制使用详解反射定义反射API反射对于单例的破坏IOC容器反转控制原理反射的定义java反射机制是java开发中有一个非常重要的概念,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以动态调用方法和属性,大部分框架也都是运用反射原理的。比如Spring。首先大家应该先了解...

weixin_39956022的博客 1219

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1927

宇树G1二次开发资料汇总

宇树科技G1是一款29自由度的商业级人形机器人,配备NVIDIA Jetson Orin NX计算平台和完整SDK生态。本文系统介绍了G1的硬件架构、29个关节配置、传感器外设、双计算单元设计等关键信息,并详细解析了软件生态体系,包括C++/Python SDK、ROS2接口、仿真工具和AI框架。开发者可通过DDS通信实现高层运动控制或底层关节级精确控制,支持快速二次开发。文档提供了网络配置、接口调用示例等实用指南,帮助开发者高效利用该平台进行人形机器人应用开发。

m0_47999117的博客 1312

java 反射机制详解_Java中反射机制详解

这篇文章主要介绍了Java反射机制及Method.invoke详解,本文讲解了JAVA反射机制、得到某个对象的属性、得到某个类的静态属性、执行某对象的方法、执行某个类的静态方法等内容,需要的朋友可以参考下 JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,反射:可以动态的获取指定类中的成员,以及建立类对象。好处:提高了程序的扩展性。张三,李四等这些生活中的对象,可以通过Person...

weixin_31629913的博客 178

Python 爬虫实战:网站反爬机制绕过终极指南(技术原理 + 实战代码 + 避坑技巧)

在 Python 爬虫的世界里,反爬机制是每一个爬虫开发者都必须面对的挑战。网站为了保护自身数据不被恶意爬取,会设置各种反爬机制,这使得爬虫开发变得更加复杂和有趣。本文将详细介绍常见的网站反爬机制及其绕过方法,结合技术原理、实战代码和避坑技巧,帮助你成为一名优秀的爬虫开发者。

u014481728的博客 1004

Java反射机制详解——超详细

| |目录1反射机制是什么2反射机制能做什么3反射机制的相关API·通过一个对象获得完整的包名和类名·实例化Class类对象·获取一个对象的父类与实现的接口·获取某个类中的全部构造函数 - 详见下例·通过反射机制实例化一个类的对象·获取某个类的全部属性·获取某个类的全部方法·通过反射机制调用某个类的方法·通过反射机制操作某个类的属性·反射机制的动态代理4反射机制的应用实例·在泛型为Integer的...

刘成 4429

Windows Docker Desktop部署MaxKB详细教程

MaxKB(Max Knowledge Base)是一款基于大语言模型(LLM)和检索增强生成(RAG)技术的开源知识库问答系统,旨在帮助企业、教育机构及研究组织高效管理知识并提供智能问答服务。

猿小白的博客 1372

NVIDIA Jetson之远程控制软件NoMachine安装使用

参考:https://www.bilibili.com/video/BV1cg4y1i776?t=12 0 背景

ZONGXP的博客 1万+

Java 基础 - 反射机制详解

本文综合多篇文章后,总结了Java 反射的相关知识,希望可以提升你对Java中反射的认知效率。

qq_63353796的博客 1272

Python实现将txt文件转换成对应的excel或csv文件

此外,在上面的例子中,txt文件是以“空格”分隔的,如果遇到“逗号”分隔的,只需将上述代码中的。本文是该专栏的第29篇,后面会持续分享python的各种干货知识,值得关注。工作上可能会遇到这样的情况,使用python将某个txt文本,按照。转换成对应的excel文件或者是csv文件。”需要替换成你的目标txt文件的绝对路径。库,这里直接引用就好。需要注意的是,上述代码中的“

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 4506

Java中反射机制详解

最近小熙在复习反射相关的知识,碰到一篇还不错的分享下     序言       在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的。                             ...

人生到处知何似,应似飞鸿踏雪泥。 251

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中反射机制详解(转)

转自:https://www.cnblogs.com/whgk/p/6122036.html     序言       在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的。          ...

qq_21479345的博客 168

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java反射机制原理详解_java反射机制的详细讲解

一 , 什么是java反射机制?JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。1.意义首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标...

weixin_39998462的博客 3612

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java-反射机制详解

文章目录1. 反射机制概述1.1 Java反射机制1.2 Java反射机制提供的功能1.3 反射相关主要的API2. Class类2.1 如何理解Class类2.2 Class类实例的获取方式2.3 哪些类型可以有Class对象实例3. 类的加载与类加载器3.1 类的加载过程3.2 类加载器的作用3.3 类加载器的划分3.4 使用类加载器加载配置文件4. 创建运行时类的对象 1. 反射机制概述 1.1 Java反射机制 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期间借助于Re

郭松源的博客 531

JAVA的反射机制详解

首先,大家应该先明白两个概念:编译期和运行期。编译期就是编译器帮你把源代码翻译成机器能执行的文件,比如编译器把java代码编译成jvm能识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行。Java反射(Reflection)就是Java程序在运行时,可以加载、探知、使用编译期间完全未知的类。也就是说,Java可以加载一个运行时才得知类名的类,获得类的完整构造方法,并实例化出对象,给对象...

yechengchao的博客 192

java反射机制详解

资料来源:尚学堂(http://www.bjsxt.cn/) java反射机制详解 反射机制 指的是可以于运行时加载、探知、使用编译期间完全未知的类。 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性; Class类介绍 java.lang.Class类十分特殊,用来表示java中...

wangking407的博客 281
上一篇: Java IO流详解
下一篇: MyBatis---(第一部分)
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值