java反射详讲

《Java编程十五讲》第3讲反射,对于写工具写框架平台的程序员来讲,没有反射,都不知道该怎么编程序了 #第三讲 反射 知识点之间是有逻辑关联的,配合在一起构成一个体系。讲了前两次,大家都发觉了会用到一个共同的知识点,叫反射(Reflection)。那么今天我就来给大家讲讲这个反射,也有好几位提出希望进一步了解一下。 这个词的中文翻译不是很好,不容易从字面体会到含义。按照英文词典的解释,Reflection的常用的一个意思是the image of something in a mirror(映照出... 阅读详情

好的!以下是关于 Java 反射的详细讲解(约5000字左右)。内容包括基础概念、反射的优缺点、基本用法,以及典型案例。


Java 反射详解

反射是 Java 中的一项强大机制,允许程序在运行时动态获取类的相关信息,并对其进行操作。这项特性使得 Java 程序具备了极大的灵活性,适用于框架开发、工具构建等场景。

1. 什么是反射?

Java 的反射机制允许程序在运行时获取有关类及其成员的信息,例如类名、方法、字段、构造器等。反射还可以动态调用类的成员方法或访问字段。

核心思想:

  • 在编译时,代码中对象类型是明确的;
  • 在运行时,通过反射获取类的信息,动态操作这些类的成员。

反射的核心 API 位于 java.lang.reflect 包,包括:

  • Class 类:代表类本身,用于获取类的结构信息;
  • Field 类:代表类的字段;
  • Method 类:代表类的方法;
  • Constructor 类:代表类的构造器。

2. 为什么需要反射?

反射提供了很多动态功能,以下是几个典型的应用场景:

  • 框架开发:像 Spring 和 Hibernate 等框架,广泛使用反射来动态加载类和注入依赖。
  • 序列化/反序列化:将对象转换为字节流,或从字节流还原对象。
  • 测试工具:如 JUnit,动态调用测试方法。
  • 插件机制:加载用户定义的类或第三方模块。
  • 动态代理:如实现 AOP(面向切面编程)。

3. 反射的优缺点

优点

  1. 动态性:能够在运行时加载类,并对其进行操作。
  2. 灵活性:无须在编译时确定需要操作的对象和类。
  3. 解耦性:通过反射,可以减少不同模块间的耦合。

缺点

  1. 性能问题:反射操作通常比直接调用慢,因为需要解析和检查类型信息。
  2. 安全性风险:可以突破封装性,例如访问私有字段和方法。
  3. 代码复杂度:代码可读性和调试难度增加。

4. 基本用法

4.1 获取 Class 对象

在 Java 中,获取 Class 对象有三种方式:

  1. 通过类名:
    Class<?> clazz = MyClass.class;
    
  2. 通过对象:
    MyClass obj = new MyClass();
    Class<?> clazz = obj.getClass();
    
  3. 通过类全限定名:
    Class<?> clazz = Class.forName("com.example.MyClass");
    

4.2 获取类信息

通过 Class 对象可以获取类的基本信息:

Class<?> clazz = String.class;
System.out.println("类名: " + clazz.getName());
System.out.println("包名: " + clazz.getPackage());
System.out.println("父类: " + clazz.getSuperclass());
System.out.println("实现的接口: ");
for (Class<?> iface : clazz.getInterfaces()) {
    System.out.println(iface.getName());
}

4.3 操作字段

使用 Field 类动态操作类中的字段:

import java.lang.reflect.Field;

class Person {
    public String name;
    private int age;
}

public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Person.class;

        // 获取公共字段
        Field nameField = clazz.getField("name");
        System.out.println("字段名称: " + nameField.getName());

        // 获取所有字段(包括私有字段)
        Field ageField = clazz.getDeclaredField("age");
        ageField.setAccessible(true); // 允许访问私有字段
        Person person = new Person();
        ageField.set(person, 25);
        System.out.println("字段值: " + ageField.get(person));
    }
}

4.4 操作方法

使用 Method 类动态调用方法:

import java.lang.reflect.Method;

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Calculator.class;

        // 获取方法
        Method addMethod = clazz.getMethod("add", int.class, int.class);
        
        // 调用方法
        Calculator calc = new Calculator();
        int result = (int) addMethod.invoke(calc, 5, 10);
        System.out.println("计算结果: " + result);
    }
}

4.5 操作构造器

使用 Constructor 类创建对象:

import java.lang.reflect.Constructor;

class User {
    private String name;

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

public class ReflectionDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = User.class;

        // 获取构造器
        Constructor<?> constructor = clazz.getConstructor(String.class);

        // 创建对象
        User user = (User) constructor.newInstance("Alice");
        System.out.println("用户名称: " + user.name);
    }
}

5. 高级特性

5.1 动态代理

反射机制支持动态代理,用于创建代理类以实现方法拦截和 AOP。以下是简单示例:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Greeting {
    void sayHello();
}

class GreetingImpl implements Greeting {
    public void sayHello() {
        System.out.println("Hello, World!");
    }
}

public class DynamicProxyDemo {
    public static void main(String[] args) {
        GreetingImpl realObj = new GreetingImpl();
        
        // 创建代理对象
        Greeting proxyObj = (Greeting) Proxy.newProxyInstance(
            GreetingImpl.class.getClassLoader(),
            new Class<?>[] { Greeting.class },
            new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("方法调用前");
                    Object result = method.invoke(realObj, args);
                    System.out.println("方法调用后");
                    return result;
                }
            }
        );

        proxyObj.sayHello();
    }
}

6. 常见问题及注意事项

6.1 性能优化

反射操作通常较慢,建议:

  • 缓存频繁使用的 Field、Method、Constructor 对象。
  • 谨慎使用反射,只在必要时应用。

6.2 安全性

由于反射可以突破封装性,可能带来潜在风险:

  • 尽量避免对敏感字段和方法使用反射。
  • 通过权限管理机制限制反射的滥用。

6.3 Java 版本兼容性

某些反射操作可能在较新版本中被限制,例如 Java 9 引入的模块化系统对反射访问进行了严格限制。


希望这篇讲解能帮助你全面理解 Java 的反射机制!如果有其他问题或需要更深入的讨论,欢迎随时交流。

关于深度可分离卷积 关于深度学习中的深度可分离卷积 阅读详情

相关推荐

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

一文讲透 Java 中的反射

反射是 Java 中的一个特性,它允许程序在运行时获取自身的信息,并动态地操作类或对象的属性、方法和构造函数。通过反射,我们可以在事先不知道确切类名的情况下实例化对象、调用方法和设置属性。反射机制的核心是Class对象,它代表一个类。Java 虚拟机(JVM)在加载类时会自动创建这个Class对象。从上面的示例中可以看出,以Declared为前缀的方法(如)用于检索所有字段或方法,无论其访问级别如何。相比之下,没有Declared的方法(如getField)仅检索公共字段或方法。

rgrt868的博客 481

TDDFT计算软件Octopus学习笔记(二):基态计算(Si)

本文以硅为例,来进行基态计算。

陈啸的博客 7306

java:反射机制详讲

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

向上的"狼"的博客 503

通过声音识别鸟类

根据野生鸟类的外表来识别它是一回事。仅仅根据声音来识别同一只鸟是另一回事。除非你是一个熟练的观鸟者,通过声音识别鸟类可能相当具有挑战性德国马尔堡大学的一组数学、计算机科学和生物学研究人员设计了一种快速识别鸟类和监测当地生物多样性的方法。他们使用连接到 NVIDIA 的便携式设备拍摄的录音根据研究人员的说法是一个边缘人工智能系统,“基于分布式系统中运行的嵌入式边缘设备,能够对森林中记录的声景进行高效、连续的评估。”要了解更多信息,请参阅。

分享AI前沿科技 1680

OFDM基本原理

OFDM基础介绍,包括OFDM的核心思想,数学推导了OFDM信号的调制解调过程。

伊丽莎白的学习之路 8908

讲Reflection?就是Java反射了

文章目录一、Java反射1.反射实现示例2.什么是反射3.反射的原理4.反射的用法4.1 常用类4.2 基本的用法获取Class对象获取构造方法Constructor获取单个构造方法获取所有构造方法反射创建实例获取成员变量获取成员方法5.扩展 一、Java反射 参看: https://juejin.cn/post/6917050648563777544 https://juejin.cn/post/6909692344291819533 https://blog.youkuaiyun.com/a7452

彭_德华的博客 296

[24] cuda 应用之 nppi 实现图像颜色通道变换

[24] cuda 应用之 nppi 实现图像颜色通道变换

yohnyang的博客 343

【韩顺平讲Java】Java反射专题(一)

反射是框架的底层基石,对阅读框架底层源码有帮助 先提出一个需求: 1.根据配置文件 re.properties指定信息,创建对象并调用方法 classfullpath=com.hspedu.Cat method=hi ●老韩思考:使用现有技术,你能做的吗? 2.这样的需求在学习框架时特别多,即通过外部文件配置,在不修改源码情况下,来控制程序,也符合设计模式的ocp原则(开闭原则,即不修改源码,来扩展功能) 3.快速入门com.hspedu.reflection.question ReflectionQue

想握住此生辽阔 1578

2025华为OD面试手撕代码真题目录、八股文真题目录以及面试技巧

1. **华为OD面试技术面准备指南** 2. **华为OD面试技术面常见问题解答** 3. **华为OD面试技术面经验分享** 4. **华为OD面试技术面注意事项** 5. **华为OD面试技术面攻略** 6. **华为OD面试技术面模拟题目与解析** 7. **华为OD面试技术面知识点梳理** 8. **华为OD面试技术面常考**

算法大师! 3万+

【推荐100个unity插件】制作美丽 Unity 景观,增强Terrain材质表现的插件——GTS

GTS地形着色器是一款专为Unity设计的强大工具,可解决地形纹理绘制和光照处理的难题。它提供一键式配置,支持实时调整地形效果,包含细节注入、高度混合、雪注入等核心功能,并兼容网格地形和低多边形模型。插件完美集成Gaia天气系统,支持HDRP细分效果。安装后通过GTS管理器创建配置文件并应用到地形,即可快速生成高质量地形渲染。其模块化设计包含全局设置、网格转换和细节调整等面板,使开发者能灵活控制地形表现,显著提升视觉效果与性能表现。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1564

Java中的反射机制详讲

Java中的反射机制详讲1、反射机制_介绍_Class对象获取2、反射机制_动态操作_构造器_方法_属性3、动态编译_DanamicCompile_反射调用main方法问题 1、反射机制_介绍_Class对象获取 动态:在编译期间能改变结构 反射机制:指的是可以在运行时加载、探知,使用编译期间完全未知的类 /* * 测试java.lang.Class对象的获取方式 * 测试各种类型的获取方式 */ @SuppressWarnings("all") public class Test1 { publi

m0_52110974的博客 193

STM32入门教程:WiFi通信

第四步:初始化串口 在生成的代码中,您可以找到一个名为 "USARTx_Init" 的函数,其中 "x" 是您选择的串口号。然后,我们使用 "AT+CIPSEND" 命令发送UDP数据,接收到服务器的回复,并在终端上显示收到的数据。在配置向导中,您可以选择启用USART串口功能,并根据您的硬件连接,将串口设置为与WiFi模块连接的串口。在上述代码中,我们使用了 "HAL_UART_Receive" 函数来接收串口数据,并使用 printf 来在终端上显示收到的数据。如果有任何问题,请随时向我提问。

2401_85258012的博客 1073

Java基础加强第二讲 反射(下)——数组的反射

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象(此处比较与值无关)。例如, 此处,我再介绍两个方法,如下: 方法 描述 public String getName() 以String的形式返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称 public Class&amp;amp;lt;? super T&amp;amp;gt; getSuperclas...

李阿昀的博客 1390

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

通俗的讲一下Java中的反射,简单易懂

前言: 今天简单学习了下反射,B站弹幕都说听不懂,我研究了一下,发现听不懂的原因在于内容有点多,但是又无法分开学,另外一点就是老师讲的有点抽象,所以借晚上总结的时候用容易理解的语言解释一下,加深记忆。 什么是反射 定义 反射是指在程序运行过程中,动态的获取类各部分的一种技术。详细一点就是将类的各个部分封装为其他的对象。 解释 | 这两句话比较抽象,需要仔细分析一下,举一个例子:我们定义一个学生类Student,类中主要的部分是 属性,构造方法,普通方法。当然也有toString。这里我定义的时候 属性,构造

weixin_60283557的博客 953

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

java反射机制第一讲,什么是反射,为什么要用到反射

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

zlj20xz的博客 1070

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

细讲Java反射,通过案例谈原理

反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 Apple apple = new Apple(); //直接初始化,「正射」 apple.setPrice(4); 上面这样子进行类对象的初始化,我们可以理解为「正」。 而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。 这时候,我们使用 JDK 提供..

m0_60721173的博客 272

讲一下java的反射机制

Java反射机制是指在运行时通过程序获取类的信息(比如字段、方法、构造器等)并且操作这些类的信息的能力。通过反射,可以在运行时调用任意一个类的属性和方法,不必事先知道该类的具体实现,可以实现动态地生成对象、调用对象的方法和访问对象的属性等操作。

wgq2020的博客 76

【韩顺平讲Java】Java反射专题(二)

动态和静态加载 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载。 1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强 2.动态加载:运行时加载需要的类,如果运行时不用该类,则不报错,降低了依赖性 类加载时机 1.当创建对象时(new) 2.当子类被加载时,父类也加载(是静态加载,因为有继承关系) 3.调用类中的静态成员时(是静态加载) 4.通过反射(动态加载) 静态加载:编译的时候就会加载这个类(检查类是否正确、依赖关系、父类是否ok等等),比如下面这段代码 用户可能输入1,

想握住此生辽阔 1330

java中的反射(不讲概念,只是怎么用)

反射作用于分析类 要想分析一个类,必须有这个类的元数据,java中描述类的元数据的类是Class类,元数据就是类自己的数据 要想得到Class类对象,可以有多种方法 1、通过Class.forName加载类 2、通过对象.getClass 先提醒一下,关于静态块,动态块,构造方法的执行顺序如果不了解的话请看这静态块、动态块、构造函数、继承函数等的执行顺序,用代码形象的解释了一遍 1、基础类 ...

胖墩的IT博客 215

趣讲 java反射之创建运行时类的对象

可以通过反射,获取运行时类的完整结构 Field、Method、Constructor、Superclass、interface、Annotation 具体来说可以是: 实现类的全部接口 所继承的父类 全部的构造器 全部的方法 全部的Field 注解 package com.company; import sun.plugin2.message.GetNameSpaceMessage; import java.lang.reflect.Constructor; import java.lang.refl

weixin_45806131的博客 976

Java基础加强第二讲 反射(上)——反射的基石:Class类

反射的基石——Class类 Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。那么问题来了,Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?由此问题,引出了反射的基石——Class类。众多的人可以用一个Person类来表示,它的实例对象就是张三,李四这...

李阿昀的博客 843

Java基础加强第二讲 反射(中)——反射API类:Constructor、Field以及Method类

反射的基石——Class类 Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。那么问题来了,Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?由此问题,引出了反射的基石——Class类。众多的人可以用一个Person类来表示,它的实例对象就是张三,李四这...

李阿昀的博客 1099

10分钟讲java_10分钟带你理解Java中的反射

一、简介Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。二、Class类我们知道使用j...

weixin_42349272的博客 138

for java beginner13java 反射 数组的反射(上)其实是讲ArrayList HashSet HashCode

java 反射 数组的反射(上)其实是讲ArrayList HashSet HashCode ArrayList HashSet HashCode -------------------- [code="java"]package com.ncs; public class Point { private int x; public int y; p...

MyBlogName 171

通俗讲java反射机制ioc_spring的ioc原理(java反射机制)

为什么要有ioc这个概念,其实自己以前一直不是很理解,后来随着自己经验稍微多了一些,认识到,在一些系统中,通过这种依赖注入的方式确实可以让代码之间的耦合更弱一些,可以更好管理对象之间的关系。。。其实本来是想直接分析spring的源代码的,但是将ioc部分的代码,也就是beanfactory部分的代码大致的看了一次以后觉得spring的代码可能有点太多了,而且封装的太复杂,因此就直接打消了这中想法,...

weixin_39889329的博客 168
上一篇: 详解MySQL中 MVCC
下一篇: MySQL的主从复制
sevevty-seven
博客等级 码龄2年 757粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值