Java的反射

Java反射 Java的反射(reflection)机制是指在程序的运行状态中,借助取得任何类的内部信息,可以动态地构造任意一个类的对象,并能直接操作任意对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。反射主要用到java.lang.Class类和包下的一些类,是 Java 反射机制的核心包,提供了操作类及其成员(字段、方法、构造函数等)的类和接口。表示类的对象。提供了获取类的字段、方法、构造函数等方法。 阅读详情
1.什么是反射
当我们在需要一个类的实例时,一般都是new一个对象出来,然后再在该对象上调用方法。假设目前我们有个Bird类:
public class Bird {
    private static String master = "amy";
    private String name;

    public static void sayHello() {
        System.out.println("Hello " + master);
    }

    public Bird(String name) {
        this.name = name;
    }

    public Bird() {}

    public void fly() {
        System.out.println("bird fly");
    }

    private void eat() {
        System.out.println();
    }
}
我们一般是这么使用:
Bird bird = new Bird();
bird.fly();
输出:
bird fly
而利用java的反射,可以通过类的名称来创建对象,通过方法的名称来调用方法,如下所示:
Class<?> clazz = Class.forName("Bird");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("fly");
method.invoke(obj);
输出:
bird fly
从代码中可以看到,我们先是通过类的名称"Bird"获得类的类对象(即Bird类的Class对象),然后通过Class对象获取了代表类的fly方法的Method对象,最后通过Method对象的invoke方法调用了Bird类的fly方法。在这里,我们自始至终对Bird类毫无感知。

程序中对象的类型一般都是在编译时确定下来的,而通过java的反射机制,我们可以在运行时动态的获取类的信息,并生成类的对象并调用其方法。Java的反射机制主要提供以下功能:
  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
  • 在运行时调用任意一个对象的方法
2.反射的原理
我们知道,java中任何一个类都会被编译成字节码文件,即.class文件,比如上例中的Bird.java文件,编译成功后生成Bird.class文件,类的所有信息都保存在它的.class文件中。当使用到某个类时,类的.class文件便会被jvm加载到内存中,jvm通过解析该.class文件,便可以获得该类的所有信息。

为了描述每个类的信息,java中用Class类来描述一个类的信息(注意:Class也是一个类, 即Class类是用来描述类的类),每个类的.class文件被jvm解析后,jvm就会为其创建一个Class对象(放置于jvm的方法区),这个对象里保存了这个类的所有信息。假设我们程序中有Bird、Fish这2个类,那么jvm将它们的.class文件加载后,jvm中就会有2个Class对象,一个描述了Bird类的信息,另一个描述了Fish这个类的信息。每个类在jvm中有且只有一个Class对象。只要拿到类的Class对象,我们就可以知道类有什么方法、有什么成员变量,也可以轻松的创建类的实例对象。反射的本质就是获取到类的Class对象。
3.反射的接口
3.1 获取类的class对象
(1)使用Class类的forName静态方法,如:
Class<?> clazz = Class.forName("Bird");
(2)调用类的.class方法,如:
Class<?> clazz = Bird.class; 
(3)调用对象的getClass方法,如:
Bird bird = new Bird();
Class<?> clazz = bird.getClass();
注意,方法(1)和方法(2)的区别是,方法(1)加载类时会执行类的初始化语句,而方法(2)不会。
3.2 判断对象是否是某个类的实例
调用Class对象的isInstance(Object)方法就可以判断某个对象是否是某个类的实例,如:
Class<?> clazz = Class.forName("Bird");
Bird bird = new Bird();
String str = "Bird";
System.out.println(clazz.isInstance(obj));
System.out.println(clazz.isInstance(str));
输出:
true
false
3.3 获取类的构造函数
Java中用Constructor类来描述一个类的构造函数。通过Class对象的以下方法,就可以获得一个类的构造函数:
Constructor getConstructor(Class[] params); --------- 获取类的某个特定的公有构造函数,
Constructor[] getConstructors(); ---------------------- 获取类的所有公有构造函数
Constructor getDeclaredConstructor(Class[] params); - 获取类的某个特定的构造函数,不论是什么访问级别
都可以 Constructor[] getDeclaredConstructors(); -- -----获取类的所有构造函数,所有访问级别的都返回
假设clazz是Bird类的Class对象,以下方法返回Bird(String name)这个构造函数:
Constructor ctr = clazz.getConstructor(String.class);
3.4 创建对象
(1)调用Class对象的newInstance方法来创建实例
Object obj = clazz.newInstance();
该方法要求类具有不含参数的构造函数。
(2)调用Constructor对象的的newInstance()方法来创建实例
Class<?> clazz = Class.forName("Bird");
Constructor ctr = clazz.getConstructor(String.class);
Object bird = ctr.newInstance("Big");
该方法可以通过指定的构造函数来创建实例。
3.5 获取类的方法
Java中用Method类来描述类的一个方法,类的每个方法都对应一个Method对象,可以调用Class对象的以下方法来获取类的方法:
Method getMethod(String name, Class[] params); ---------- 获取类的某个特定的公有方法
Method[] getMethods(); ------------------------------------ 获取类的所有公共方法,包括继承而来的公有方法
Method getDeclaredMethod(String name, Class[] params) -- 获取特写的某个方法,不区分访问类型
Method[] getDeclaredMethods() ------------ 获取类的所有方法(不论什么访问权限),不包括继承而来的方法
注意,静态方法也会返回。
如:
Class<?> clazz = Class.forName("Bird");
Method[] methods = clazz.getMethods();
for (Method method1 : methods) {
    System.out.println(method1);
}
输出为:
public void Bird.fly()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
上述方法获取了Bird类的所有方法,包括从Object类继承的方法,但并没有返回Bird类的私有方法eat()。如果调用的是getDeclaredMethods()方法,则输出为:
public void Bird.fly()
private void Bird.eat()
即getDeclaredMethods()方法返回类的所有方法,不论是公有的还是私有的,但不包括继承而来的方法。
3.6 获取类的成员变量
Java中用Filed类来描述类的一个成员变量,类的每个成员变量都对应一个Filed方法。可以调用Class对象的如下方法,以获取类的成员变量:
Field getField(String name); ---------- 获取某个特定的公有成员变量;
Field[] getFields(); ------------------- 获取类的所有公有成员变量;
Field getDeclaredField(String name) -- 获取类的某个特定成员变量,不区分访问类型;
Field[] getDeclaredFields() -- ----------获取类的所有成员变量,不区分访问类型
注意,static变量也会返回。
如下:
Class<?> clazz = Class.forName("Bird");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
    System.out.println(field);
}
输出为:
private static java.lang.String Bird.master
private java.lang.String Bird.name
3.7 调用方法
获取到类的某个方法的Method对象后,就可以调用该方法了:
String className = "Bird";
String methodName = "fly";

Class<?> clazz = Class.forName(className);
Object obj = clazz.newInstance();
Method method = clazz.getMethod(methodName);
method.invoke(obj);
输出:
bird fly



把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解 摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15 阅读详情

相关推荐

HyperLPR3车牌识别-Android-SDK光速部署与使用

基于深度学习高性能中文车牌识别 High Performance Chinese License Plate Recognition Framework.快速部署AndroidSDK

tunm 6119

Java 反射

反射(reflection)是 Java 中的一项特性,它允许程序在运行时查询和操作类的信息。即,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性。获取到方法和属性后,就可以对其进行修改。这种动态获取信息以及动态调用对象方法的功能也就是Java的反射机制

2301_76161469的博客 8774

用逐飞STC32G库做个智能小车:编码器测速、PWM调电机、ADC读电池电压(完整项目)

本文详细介绍了如何使用逐飞科技的STC32G12K128开源库构建智能小车项目,涵盖编码器测速、PWM电机控制和电池电压监测等核心功能。通过硬件选型、开发环境搭建、代码实现及调试技巧的全流程讲解,帮助开发者快速掌握基于STC32G的嵌入式系统开发,实现高性能的智能小车控制。

weixin_42526417的博客 194

Java之反射

1.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于 任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的 方法的功能称为java语言的反射机制。 2.Class类对象的三种实例化模式 在默认情况下我们是根据包名.类名找到类。而反射是根据对象来取得对象的信息来源。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所 以先要获取到每一个字节码文件对应的Clas....

柠檬精 4万+

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

快速理解OSI七层模型(举例理解,数据传输过程,深入理解OSI七层模型)

我们需要了解互联网的本质是一系列的网络协议,这个协议就叫做OSI协议(开放系统互联(Open System Interconnection)),它是由ISO(国际标准化组织)定义的。 需要注意,随着时代的发展,OSI已经被TCP/IP 4层模型淘汰,在当今世界上并没有大规模的使用。 那么对于OSI,人们按照功能不同,分工不同,人为的将OSI的分为七层。实际上这七层是并不存在的,也就是说没有这些概念,而我们今天提到的七层概念,只是人为的划分而已。目的只是为了让大家更好地理解这些都是用来做什么的。

CN_TangZheng的博客 3万+

java反射&python反射

作为一只主学java,次学python的猿,反射的梗,怎能不知道 一、反射是什么: 维基百科上给出的定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 以我浅薄的编程思想理解的反射: 反射可以让我们在不打开程序文件的情况下,清楚的知道该程序的内部结构...

远处 1475

[Dify] 多步对话流程的实现技巧:构建连贯自然的多轮交互系统

摘要:本文探讨了AI系统中实现多轮对话的核心技术与应用方法。文章首先分析了多步对话的典型场景(如机票预订、财务报告生成)及其价值,提出了Dify平台实现该功能的三大机制:变量系统、条件控制和状态管理。随后详细介绍了顺序型、条件型和确认型三种基本对话模式,并通过"会议预约助手"案例展示了实际应用流程。文章还提供了提示词设计、变量引用等实用建议,并强调多轮对话成功的关键在于清晰的结构设计而非单纯依赖模型能力,最终实现自然流畅的人机交互体验。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1343

Java 的反射

Java反射机制允许程序在运行时动态获取类信息并操作对象,是Java动态性的核心体现。反射通过Class类获取类结构,包括构造方法、字段和方法,还能创建对象、调用方法和修改字段值。反射支持泛型类型信息获取,广泛应用于框架开发、动态代理等场景。尽管反射功能强大,但性能开销较大,且可能破坏封装性,需谨慎使用。

weixin_73916358的博客 1252

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3547

解决【x2openEuler环境检查未通过——CheckRepoCurlActor不通过】问题

摘要:x2openEuler使用默认repo源时出现环境检查失败问题,原因是默认源返回308永久重定向错误。解决方法包括:1)为CentOS主机配置华为yum源;2)在x2openEuler Web界面修改为自定义可用源。具体步骤包括备份原源、下载华为源、清除缓存,并通过curl测试确认新源可用性。最终成功配置openEuler-24.03-LTS-SP1版本的repo源后,环境检查顺利通过。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 258

Java 反射体系

Java反射(Reflection)是Java语言的一个重要特性,它允许运行中的Java程序对自身进行检查,并且可以直接操作程序的内部属性。通过反射,我们可以在运行时获取类的信息、创建对象、调用方法以及访问和修改字段等。Java反射体系主要包括以下几个核心类:Class类:代表一个类或接口。每个类都有一个对应的Class对象,该对象包含了类的所有信息,如名称、父类、实现的接口、构造器、方法和字段等。可以通过以下几种方式获得Class类名.class对象.getClass()

weixin_47363690的博客 1512

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java反射三种方法_反射及暴力反射

作者:逯小逯出自:SegmentFault 思否原文:segmentfault.com/a/1190000037432381反射一、概述(1)反射的定位是很重要的,JVM和底层框架都离不开反射(2)反射的原理是拿到你的class文件里的数据,进行数据的操作(CURD)(3)反射提供了丰富的方法,来操作类里的各种数据(属性/方法/构造)(4)REflection(反射)是Java程序开发语言的特征之...

weixin_39586353的博客 2389

jre9下载 jdk9

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 反射_反射实例——JAVA反射机制

一、Java反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作...

weixin_39713578的博客 138

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JAVA反射

Java是先编译再运行的语言,程序中对象的类型在编译期就确定下来了;而当程序在运行时需要动态加载某些类时(这些类因为之前用不到没有被加载到JVM),通过反射可以在运行时动态地创建对象并调用其属性,我们不需要提前在编译期知道运行的对象是谁。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。Java反射机制的本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。java反射详解。

qq_39239864的博客 959

Java反射之方法反射demo

Java反射之方法反射demo package reflect; import java.lang.reflect.Method; public class ClassDemo3 { public static void main(String[] args) { String s = "hello"; ClassUtil.printClassMethodMessage(s

龙腾四海365的专栏 2692

Java 反射机制[Method反射]

Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射。示例代码很简单,很容易理解。 可以看到Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理。 真正的反射是调用MethodAccessor.invoke

Stop Tears 1970

Java反射概念及类的反射

Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接

wangliaizq10000的专栏 7390

java反射

方法说明返回一个Method类型的数组其中包含 所有公共(public)方法。返回一个Method类型的数组其中包含 所有方法。>...返回一个公共的Method方法对象。>...返回一个方法Method对象。

qq_74947724的博客 955

Java—反射

Java反射

且将&的博客 684

java 反射

参考资料: Java反射技术详解_黄林晴的博客-优快云博客_java反射 Java高级篇(四)——反射 - JAdam - 博客园 一、什么是反射   反射就是把Java类中的各个成分映射成一个个的Java对象。 即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用它的任意一个方法和属性。 这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。 1. 反射机制的功能   Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属

喵酱 2851
上一篇: Java中的Date和时区转换
下一篇: java动态代理
halfclear
博客等级 码龄10年 32粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值