12、Java 反射机制详解

基于FLUENT的圆柱绕流数值模拟与流场优化策略 本文详细介绍了基于FLUENT的圆柱绕流数值模拟方法与流场优化策略。从基础概念、建模技巧到湍流模型选择,全面解析了圆柱绕流模拟的关键技术,并提供了实用的网格划分和参数设置建议。通过具体案例展示了流动控制方法和优化流程,帮助工程师有效降低阻力系数,提升流场性能。 阅读详情

开篇概览:反射的核心价值

反射(Reflection) 是 Java 在运行时动态分析、操作类与对象的能力。它允许程序在运行时:

  • 获取类的完整结构(字段、方法、构造器等);
  • 动态创建对象;
  • 动态调用方法、访问字段;
  • 突破访问控制(如访问 private 成员)。

反射是许多高级框架(如 Spring、Hibernate、JUnit)的底层基础,也是实现插件化、动态代理、ORM 映射等技术的关键。

⚠️ 重要前提:

  • 反射操作性能较低(比直接调用慢数倍);
  • 破坏封装性,应谨慎使用;
  • 仅在编译期无法确定类型时使用(如框架开发、通用工具)。

一、Class 类:反射的入口

java.lang.Class 是反射的核心类,代表运行时的类元数据。每个类在 JVM 中有且仅有一个 Class 对象。

1.1 获取 Class 对象的三种方式

方式说明示例
类名.class编译期已知类型String.class
对象.getClass()通过实例获取"hello".getClass()
Class.forName("全限定类名")动态加载(常用)Class.forName("java.lang.String")

1.2 示例:获取 Class 对象

public class ClassDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        // 方式1:通过类字面量(推荐,简洁安全)
        Class<String> stringClass1 = String.class;

        // 方式2:通过对象实例
        String str = "Hello";
        Class<? extends String> stringClass2 = str.getClass();

        // 方式3:通过全限定类名(动态加载,可能抛出 ClassNotFoundException)
        Class<?> stringClass3 = Class.forName("java.lang.String");

        // 验证三个 Class 对象是否相同(同一类在 JVM 中只有一个 Class 实例)
        System.out.println("方式1 == 方式2: " + (stringClass1 == stringClass2)); // true
        System.out.println("方式1 == 方式3: " + (stringClass1 == stringClass3)); // true

        // 获取类的基本信息
        System.out.println("类名(含包): " + stringClass1.getName());       // java.lang.String
        System.out.println("简单类名: " + stringClass1.getSimpleName());     // String
        System.out.println("是否为接口: " + stringClass1.isInterface());    // false
        System.out.println("是否为数组: " + stringClass1.isArray());        // false
    }
}

✅ 关键点:

  • Class.forName() 会初始化类(执行 static 块);
  • 若只需加载类而不初始化,使用 Class.forName(name, false, loader)。

二、获取类的成员信息

通过 Class 对象可获取类的构造器、字段、方法等元数据。

2.1 核心方法概览

获取内容方法返回类型
构造器getConstructors() / getDeclaredConstructors()Constructor<?>[]
字段getFields() / getDeclaredFields()Field[]
方法getMethods() / getDeclaredMethods()Method[]

🔑 getXXX() vs getDeclaredXXX():

  • getXXX():仅返回 public 成员(包括继承的);
  • getDeclaredXXX():返回 所有声明的成员(含 private/protected,但不包括继承的)。

2.2 示例:分析类的结构(详细中文注释)

import java.lang.reflect.*;

// 定义一个测试类(含 private 成员)
class Person {
    public String name;
    private int age;
    protected String email;

    public Person() {}
    private Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void sayHello() {
        System.out.println("Hello, I'm " + name);
    }

    private void setAge(int age) {
        this.age = age;
    }
}

public class ReflectionAnalysisDemo {
    public static void main(String[] args) {
        Class<Person> personClass = Person.class;

        // 1. 获取所有 public 构造器(包括继承的,但 Object 无 public 构造器)
        System.out.println("=== public 构造器 ===");
        Constructor<?>[] publicConstructors = personClass.getConstructors();
        for (Constructor<?> c : publicConstructors) {
            System.out.println("构造器: " + c);
        }
        // 输出: public Person()

        // 2. 获取所有声明的构造器(含 private)
        System.out.println("\n=== 所有声明的构造器 ===");
        Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
        for (Constructor<?> c : declaredConstructors) {
            System.out.println("构造器: " + c);
        }
        // 输出: 
        // public Person()
        // private Person(java.lang.String,int)

        // 3. 获取所有 public 字段(包括继承的)
        System.out.println("\n=== public 字段 ===");
        Field[] publicFields = personClass.getFields();
        for (Field f : publicFields) {
            System.out.println("字段: " + f.getType().getSimpleName() + " " + f.getName());
        }
        // 输出: String name

        // 4. 获取所有声明的字段(含 private/protected)
        System.out.println("\n=== 所有声明的字段 ===");
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field f : declaredFields) {
            System.out.println("字段: " + f.getType().getSimpleName() + " " + f.getName() + 
                             " (修饰符: " + Modifier.toString(f.getModifiers()) + ")");
        }
        // 输出:
        // String name (修饰符: public)
        // int age (修饰符: private)
        // String email (修饰符: protected)

        // 5. 获取所有 public 方法(包括继承的 Object 方法)
        System.out.println("\n=== public 方法 ===");
        Method[] publicMethods = personClass.getMethods();
        for (Method m : publicMethods) {
            System.out.println("方法: " + m.getName());
        }
        // 输出: sayHello, wait, equals, toString, hashCode 等

        // 6. 获取所有声明的方法(不含继承的)
        System.out.println("\n=== 所有声明的方法 ===");
        Method[] declaredMethods = personClass.getDeclaredMethods();
        for (Method m : declaredMethods) {
            System.out.println("方法: " + m.getName() + 
                             " (修饰符: " + Modifier.toString(m.getModifiers()) + ")");
        }
        // 输出:
        // sayHello (修饰符: public)
        // setAge (修饰符: private)
    }
}

✅ 关键点:

  • 使用 Modifier.toString() 可读化修饰符;
  • getMethods() 包含从 Object 继承的方法(如 toString)。

三、通过反射操作对象

3.1 创建对象

方式1:调用无参构造器
// 使用 Class.newInstance()(已废弃,Java 9+)
// Person p = (Person) personClass.newInstance();

// 推荐方式:通过 Constructor
Constructor<Person> constructor = personClass.getConstructor();
Person person = constructor.newInstance();
方式2:调用带参构造器(含 private)
// 获取 private 构造器
Constructor<Person> privateConstructor = personClass.getDeclaredConstructor(String.class, int.class);
// 突破访问控制
privateConstructor.setAccessible(true);
Person person2 = privateConstructor.newInstance("张三", 25);

3.2 调用方法

调用 public 方法
// 获取 public 方法
Method sayHelloMethod = personClass.getMethod("sayHello");
// 调用方法(第一个参数是对象实例)
sayHelloMethod.invoke(person2); // 输出: Hello, I'm 张三
调用 private 方法
// 获取 private 方法
Method setAgeMethod = personClass.getDeclaredMethod("setAge", int.class);
// 突破访问控制
setAgeMethod.setAccessible(true);
// 调用 private 方法
setAgeMethod.invoke(person2, 30);

3.3 访问字段

访问 public 字段
// 直接访问 public 字段
Field nameField = personClass.getField("name");
nameField.set(person2, "李四"); // 设置值
String name = (String) nameField.get(person2); // 获取值
System.out.println("姓名: " + name); // 李四
访问 private 字段
// 访问 private 字段
Field ageField = personClass.getDeclaredField("age");
ageField.setAccessible(true); // 突破访问控制
ageField.set(person2, 28);
int age = (int) ageField.get(person2);
System.out.println("年龄: " + age); // 28

四、完整示例:反射综合应用

import java.lang.reflect.*;

// 测试类
class Student {
    private String name;
    private int score;

    public Student() {}

    public void study() {
        System.out.println(name + " 正在学习,当前分数: " + score);
    }

    private void updateScore(int newScore) {
        this.score = newScore;
        System.out.println("分数已更新为: " + score);
    }
}

public class FullReflectionDemo {
    public static void main(String[] args) throws Exception {
        // 1. 获取 Class 对象
        Class<Student> studentClass = Student.class;

        // 2. 创建对象(调用无参构造器)
        Student student = studentClass.getConstructor().newInstance();
        System.out.println("对象创建成功: " + student);

        // 3. 设置 private 字段
        Field nameField = studentClass.getDeclaredField("name");
        nameField.setAccessible(true);
        nameField.set(student, "王五");

        Field scoreField = studentClass.getDeclaredField("score");
        scoreField.setAccessible(true);
        scoreField.set(student, 85);

        // 4. 调用 public 方法
        Method studyMethod = studentClass.getMethod("study");
        studyMethod.invoke(student); // 王五 正在学习,当前分数: 85

        // 5. 调用 private 方法
        Method updateScoreMethod = studentClass.getDeclaredMethod("updateScore", int.class);
        updateScoreMethod.setAccessible(true);
        updateScoreMethod.invoke(student, 92); // 分数已更新为: 92

        // 6. 验证字段值是否更新
        int currentScore = (int) scoreField.get(student);
        System.out.println("最终分数: " + currentScore); // 92
    }
}

✅ 输出:

对象创建成功: reflection.Student@...
王五 正在学习,当前分数: 85
分数已更新为: 92
最终分数: 92

五、反射的局限性与最佳实践

⚠️ 局限性

  1. 性能开销大:方法调用比直接调用慢 2-3 倍;
  2. 破坏安全性:可绕过访问控制(需 SecurityManager 限制);
  3. 代码脆弱:依赖字符串(如方法名),重构易出错;
  4. 泛型擦除:运行时无法获取泛型实际类型。

✅ 最佳实践

  1. 仅在必要时使用:如框架开发、通用工具类;
  2. 缓存反射对象:避免重复获取 Method/Field;
  3. 优先使用 getDeclaredXXX() + setAccessible(true);
  4. 处理异常:ReflectiveOperationException(含 ClassNotFoundException、NoSuchMethodException 等);
  5. 考虑替代方案:如接口、Lambda、注解处理器。

六、总结:反射核心能力全景

能力方法用途
获取 Class类.class, 对象.getClass(), Class.forName()反射入口
创建对象Constructor.newInstance()动态实例化
调用方法Method.invoke()动态方法调用
访问字段Field.get() / set()动态读写属性
突破访问控制setAccessible(true)访问 private 成员

📌 核心思想:
“反射是 Java 的‘自省’能力,让程序在运行时理解自身结构。”
它是一把双刃剑——用得好可构建灵活框架,用得滥则导致代码脆弱。掌握反射,是深入理解 Java 语言与 JVM 机制的关键一步。

Verilog仿真时读取bin文件模拟输入数据流,将输出数据流写入bin文件 需要关注的是,一般会省略文件起始地址和读取长度,那么mem为多大,就会从文件中读取多大的数据出来填充mem。如果只需要读取一次文件,那么代码到此就结束了,但是如果还需要每一帧都读取该文件转换为数据流,则在循环里判断新的一帧信号是否到来,在新的一帧再次打开一次文件,从头开始读取数据。 阅读详情

相关推荐

Ubuntu22.04下安装LDAP

在Ubuntu22.04的时候可以使用apt的方式来安装,在安装LDAP的web 服务器的时候可以考虑选择 LDAP 帐户管理器 (LAM)。因为 PHPLDAPadmin 安装时需要 php 的环境依赖,相对来说安装麻烦。此外在 PHPLDAPadmin 中创建组织和用户时与平常的语法有很大不同,对新手来说不友好。

dl_11的博客 3944

12 java中的反射机制总结

反射:通过class文件的对象,来获取构造函数,字段,方法的操作。 类对象:类加载的产物,封装了类的信息(类名,父类,接口,属性,方法) 框架开发原理:反射机制 + XML解析 学习反射的目的:有些时候,JDK中的方法没有在帮助文档中提供,但是通过查看源码,却发现有这个 方法,如果必须要用这个方法,就可以通过反射的方法来获取,进行使用。 反射应用场景: Jdbc加载驱动; Spring IOC ...

数据知道的博客 1万+

WOFOST模型参数调优实战:从‘跑不通’到‘预测准’的避坑指南

本文详细介绍了WOFOST模型参数调优的实战技巧,帮助用户从模型报错诊断到参数敏感性分析,再到土壤-作物参数联调策略,逐步解决‘跑不通’到‘预测准’的问题。通过Python和PCSE工具,提供参数扰动测试模板和关键参数优先级矩阵,助力作物模型的高效校准与预测。

weixin_32597009的博客 621

Day12-Java反射机制

title: Day12-反射机制 date: 2020-07-18 18:37:30 tags: 反射机制 Java反射机制就是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;对于这种动态获取的信息以及动态调用对象的方法和功能称为Java语言的反射机制。 简述:动态获取类中的信息,就是Java反射 反射机制实现 要想对字节码文件进行解剖,必须要有字节码文件对象 获取字节码对象的方式一: Object类中的ge.

欢迎来到Liu_zimo的博客 316

深入解析国家企业征信系统瑞数6vmp算法逆向实战

本文深入解析了国家企业征信系统所采用的双层防护机制,重点聚焦于瑞数6代vmp算法的逆向实战。文章详细拆解了从加速乐521状态码的绕过,到瑞数412挑战的核心算法还原过程,提供了通过动态Hook、日志分析进行算法逆向,并用Python实现自动化请求链的完整技术方案,旨在为安全研究与技术学习提供参考。

yellow的专栏 607

保姆级教程:在Ubuntu 20.04上从源码编译Apollo自动驾驶平台(含GPU环境配置)

本文提供了一份详细的Ubuntu 20.04上从源码编译Apollo自动驾驶平台的保姆级教程,包括GPU环境配置、Docker部署和编译构建等关键步骤。通过实战经验和避坑指南,帮助开发者高效完成Apollo平台的编译和验证,适用于自动驾驶技术研究和应用开发。

weixin_30876945的博客 404

随笔12 java反射机制

一:反射机制 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。 二:反射机制的作用 1反编译:.class-->.java 2通过反射机制访问java对象的属性,方法,构造方法等; 三:sun为我们提供了那些反射机制...

weixin_30553777的博客 116

OSPF规划两大模型:双塔奇兵、犬牙交错

大家好,今天给大家带来的是OSPF规划两大模型:双塔奇兵、犬牙交错,让我们直接开始吧! OSPF规划之双塔奇兵 说明: OSPF 如果某个区域存在两个 ABR,并且在两个 ABR 上都对 area n 内的路由做了聚合操作。 最佳配置: 两台ABR之间的红线应该使用以太网的子接口技术,一个子接口属于area0,另一个属于 area n;或者该链路规划为 area n,同时配置虚连接; ABR 的 loopback0 规划入 area 0 OSPF 规划之犬牙交错 说明: 有时接入层的设备会以乱序的

网络技术联盟站 2423

第12章_JAVA反射机制

尚硅谷宋红康的javase笔记

weixin_46655235的博客 214

《YOLO系列模型的多模态项目》配置使用教程(必看内容)

在根目录的文件夹中用于存放的是我已经配置好的一些多模态融合模型,可结合专栏中相应的文章介绍,进一步了解测试其中内容。

Limiiiing的博客 4646

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用RFAConv感受野注意力卷积改进YOLO26检测头,RFAHead感受野注意力检测头,助力小目标检测高效涨点

YOLO26作为轻量化目标检测模型的新一代标杆,凭借高效的Backbone与Neck结构,在实时检测场景中表现突出,但原生检测头仍存在核心痛点——感受野固定、小目标特征感知薄弱、多尺度目标适配不足,导致在小目标密集、复杂背景遮挡等场景中漏检率偏高、定位精度不足。

qq_36130719的博客 167

CH12-Java反射机制

文章目录【案例12-1】:重写toString()方法**【案例介绍】****【案例目标】****【案例分析】****【案例实现】**【案例12-2】:速度计算**【案例介绍】****【案例目标】****【案例分析】****【案例实现】**【案例12-3】:利用反射实现通过读取配置文件对类进行实例化**【案例介绍】****【案例目标】****【案例分析】****【案例实现】** 【案例12-1】:重写toString()方法 【案例介绍】 1.案例描述 ​ 为了方便输出对象,Object类提供了toStr

weixin_46227276的博客 1900

通用抓取————6D位姿估计

这意味着算法在没有物体的先验知识(如 CAD 模型)的情况下,依然能够通过神经网络捕捉物体的外观、形状和几何特征,生成相关的 6D 位姿估计。通过输入物体类别的描述,算法能够推断出该类别物体的位姿和尺度,无需特定物体的 CAD 模型。在这个坐标空间中,物体的位姿和尺度都是已知的,基于这个标准化表示,算法可以对输入图像中的物体进行 6D 位姿和尺寸的估计。○优势: ICP 是一种非常有效的位姿优化算法,特别适合精细调整物体的位姿,确保最终估计的位姿与真实物体的点云或模型高度一致。

具身机器人和通用AI 2376

12.Java反射机制:打开动态编程的大门

反射机制是Java语言的一项高级特性,允许程序在运行时获取类的完整结构信息,并动态操作类的属性、方法和构造函数。反射在框架开发(如Spring的依赖注入和AOP)、代码生成工具、插件化开发等场景中广泛应用。核心操作包括获取Class对象、创建对象实例、访问类属性和调用方法。反射的优点在于其高度灵活性和通用性,但缺点包括性能损耗、破坏封装性和降低代码可读性。学习反射需要掌握其核心概念、操作方式以及在框架中的应用,同时在实际开发中需权衡其优缺点,合理使用。通过练习和深入理解,开发者可以在合适的场景中充分发挥反射

weixin_40593051的博客 765

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

夯实Java基础系列12:深入理解Java中的反射机制

本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容。 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/01/javase13 更多关于Java后端学习的内容请到我的优快云博客上查看: ...

Java技术江湖 4715

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【12】大厂面试常问:Java反射机制是什么?

以上就是反射机制的简单的使用,显然学过spring的朋友一定明白了,为什么可以通过配置文件就可以让我们获得指定的方法和变量,在我们创建对象的时候都是通过传进string实现的,就好像你需要什么,我们去为你生产,还有我们一直在用Object,这就说明java语言的动态特性,依赖性大大的降低了。注意第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。现在得到cls1就可以创建一个Role类的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。

Java烂猪皮 111

(2.1.12)java之反射机制

一、java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式。以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出。受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦!   1.何谓反射机制   根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知

JAVA成长之路 693

java class类_夯实Java基础系列12:深入理解Java中的反射机制

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2playlife.com回顾:什么是反射?反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且...

weixin_33836754的博客 132

Java中的action函数干什么的_夯实Java基础系列12:深入理解Java中的反射机制

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2playlife.com本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我...

weixin_39575007的博客 411

java map取值_夯实Java基础系列12:深入理解Java中的反射机制

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h2pl/Java-Tutorial喜欢的话麻烦点下Star哈文章首发于我的个人博客:www.how2playlife.com枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。初探枚举类在...

weixin_39850599的博客 127

蜗牛学苑 Java 学习 Day12|反射机制、Properties、设计模式、BigDecimal 思维导图复盘

重生之我在蜗牛学苑学代码

weixin_75217422的博客 437

--反射机制和类加载器--java学习日记12(高新技术)

根据面向对象的思想,任何事物都可以抽象成类,都能用类来描述。想到java类也是一个事物,它是用什么来描述的呢?答案是Class,即类对应的字节码文件。Class是一个用来描述java类的类,它包含类的名字、成员变量、所属包、成员方法、构造方法、注解和泛型类型等信息。要得到一个java类的字节码对象,有三种方法:1.类名.class 2.对象名.getClass()...

愈知愈无知 811

Java面试基础篇

Java的强引用、弱引用、软引用、虚引用。Java语言基础常识。Java12 新特性。Java IO 详解。

m0_67391377的博客 233

JavaSE_12反射机制

JavaSE_12反射机制 1. invoke [ɪn'vəʊk] vt. 调用;祈求;引起;恳求 2. reflection [rɪ'flekʃ(ə)n] n. 反射;映象 3. type [taɪp] n. 类型,品种;模范;样式 vt. 打字; 4. reflect [rɪ'flekt] vt. 反映;反射,照出;表达;显示;反省 vi. 反射,映现;深思 5....

圆静居士的专栏 181

java基础知识12--反射与JVM/类加载/反射机制/回收机制--思维导图

请将图片下载查看

IT_CREATE的博客 314

Java核心技术第12章(4)

明天见

yiranant的专栏 763
上一篇: 11、Java 8+ 核心新特性函数式编程详解
下一篇: 13、Java 多线程与并发编程详解
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值