给小白的Java EE生存指南(6) :Java 反射

Excel转CSV避坑指南:解决乱码、丢精度、错列三大难题 CSV是一种基础文本数据交换格式,其核心在于字符编码、字段分隔与内容转义的严格规范。当从Excel导出CSV时,实际面临的是Excel引擎对数字精度(15位限制)、中文编码(UTF-8/BOM兼容性)、换行符处理(\n vs #lf)及单元格格式(显示值vs存储值)等多重隐式规则的干扰。这些技术细节直接决定BI工具、数据库或Python pandas导入时是否出现乱码、日期变序列号、长数字失真、备注列错位等高频故障。本文聚焦Excel到CSV转换这一典型数据流转场景,系统解析四种经生产环境验证的可靠路径—— 阅读详情

本文是给小白的Java EE生存指南的第6篇, 讲点稍微有深度的:反射。 

这里不定义什么叫反射,先来看个例子,假设我给你一个Java 类: 

package com.example;

public class HelloWorld {

    public HelloWorld(){

    }

    public void sayHello(){

        System.out.println("hello world!");

    }

}

现在要求: 

(1) 你不能使用 HelloWorld hw = new HelloWorld() , 但是要构建一个HelloWorld的实例来. 

(2) 调用sayHello() 方法, 但是不能直接用 HelloWorld实例的 hw.sayHello()方法  , 说起来怪拗口的 :-)

用Java的反射功能, 可以很轻松的完成上面的要求:

//第一步, 先把HelloWorld的类装载进来

Class cls = Class.forName("com.example.HelloWorld");

//第二步, 创建一个HelloWorld的实例, 注意, 这里并没有用强制转型把obj转成HelloWorld

Object obj = cls.newInstance();

//第三步, 得到这个类的方法, 注意, 一个类的方法也是对象啊

Method m = cls.getDeclaredMethod("sayHello"); 

//第四部, 方法调用, 输出"hello world"

m.invoke(obj);    

可能有人要问了, 为什么不直接new 出来呢?  通过反射来创建对象,调用方法多费劲啊 ?

这是个好问题,关键点就是: 很多时候我们并不能事先知道要new 什么对象,  相反,我们可能只知道一个类的名称和方法名, 很多时候这些名称都是写在XML配置当中的。 
 

为了更好的说明问题, 来看看几个SSH的例子:

【Struts的例子】

1. 在XML配置文件中定义Action

<action name="HelloWorld" class="example.HelloWorld">        

        <result>/hello.jsp</result>  

</action> 

2. 定义Java 类

public class HelloWorld extends ExampleSupport {  

    public String execute() throws Exception {    

        ......

        return SUCCESS;                           

    }  

    .......

}

Struts 框架的作者事先肯定不知道你会配置一个HelloWorld的Action 。

不过他可以这么做, Struts 在启动以后,解析你配置XML配置文件, 发现名称为HelloWorld的Action, 找到相对于的类名example.HelloWorld, 然后就可以通过反射去实例化这个类。 等到有人调用这个action 的时候, 可以通过反射来调用HelloWorld的execute() 方法。 

【Hibernate的例子】

1.  定义Java类和表之间映射, 类名叫Event, 对应的表名是EVENTS 。

<hibernate-mapping package="org.hibernate.tutorial.hbm">

    <class name="Event" table="EVENTS">

        <id name="id" column="EVENT_ID">

            <generator class="increment"/>

        </id>

        <property name="date" type="timestamp" column="EVENT_DATE"/>

        <property name="title"/>

    </class>

</hibernate-mapping>

2. 定义Event 类,如下所示:

public class Event {

    private Long id;

    private String title;

    private Date date;

    ...... 为了节省篇幅, 每个属性的getter /setter 方法略...

}

3. 查询, 你可以用Hibernate 这么查询表中的数据了:

List result = session.createQuery( "from Event" ).list();

        for ( Event event : (List<Event>) result ) {

            System.out.println( "Event (" + event.getDate() + ") : " + event.getTitle() );

}

Struts 的作者事先也不知道你会配置一个叫Event的类。 

不过他会这么处理: 类名(Event)-> 数据库表名(EVENTS) -> 发出SELECT查询表数据 -> 通过反射创建Event的实例 -> 通过反射调用实例的setter方法把数据库的值设置进去


【Spring的例子】

1. 配置一个Bean

<beanid="helloWorld"class="example.HelloWorld">

    <propertyname="message"value="Hello World!"/>

</bean>


2. 写一个Java 文件

public  class   HelloWorld

{

    private String message;

    public void setMessage(String message){

        this.message  = message;

    }

    public void getMessage(){

        System.out.println("My Message : "+ message);

    }

}

3. 调用


ApplicationContext context =newClassPathXmlApplicationContext("Beans.xml");

HelloWorld hw=(HelloWorld) context.getBean("helloWorld");

hw.getMessage();

我都懒得解释了, 无非是根据类的名称通过反射创建一个类HelloWorld的实例, 然后再通过反射调用setMessage方法, 这样当你getMessage就有值了。 

所以反射是很重要的, 在Java EE世界里, 反射最大的用途就是支持以声明式的方法(在XML中)来描述应用的行为,   是Struts, Hibernate , Spring 的最核心的技术之一。   

简单的来讲, 反射能让你在运行时而不是编程时做下面的事情:

(1) 获取一个类的内部结构信息(或者成为元数据), 包括包名,类名, 类所有的方法, 

(2) 运行时对一个Java对象进行操作, 包括创建这个类的实例, 设置一个属性的值, 调用这个类的方法等等。 

这篇文章只是介绍了反射的一点皮毛和用途, 具体的细节还是等待你自己去发掘吧。 

【元编程】

等等,还有一个小问题:为什么叫反射呢?

我想可能是Java程序在运行时能够看到自己的结构和行为吧, 就像看到镜子当中的自己一样, 反射了出来 。

如果扩展一点, 这种用代码来生成代码的方式, 其实叫做“元编程”。

C语言就不具备这样的能力, 经过编译以后, C语言中的struct 名称 , 数组名等信息都已经消失了, 基本上就是指针了。  你可以这么试一试:写个程序,在运行时打印一下一个struct的名称, 看看能不能实现。

但是像其他一些语言, 例如Ruby , 程序在运行时不但能检视自己, 还能动态的修改自己, 比如:给自己加上一个方法, 这种开放的能力给Ruby 编程来了巨大的飞跃, LISP的元编程能力更加强悍, 仅仅使用LISP自己就能定义一个新语言出来。 

利用这种能力, 人们可以针对某个领域编写领域特定语言(Domain specific Language, 简称DSL), 然后使用DSL这个语言来进行应用编程, 那效率可不是一般的高, 像Ruby on Rail 不就号称开发速度是Java的10倍嘛!

DSL是另外一个主题了, 你要是感兴趣的话请回复 "想听DSL" , 回复的人多了, 我可以专门开一个主题讲讲 :-)  

-----------------------------------------------------------------------------------

码农翻身公共号(coderising) : 由工作15年的IBM架构师创建,分享编程和职场的经验教训。

回复下面的关键字,查看更多文章

神一样的程序员 键盘侠 留学 读书 调试 烂代码 小白 培训

数据结构 代码腐化 无聊 迷茫 刚工作 死锁 简历  真实项目

加入码农翻身QQ群:135769418 每周日晚9点至10点定期授课,不容错过。

长按二维码, 关注"coderising"

0?wx_fmt=jpeg

【数据存储】指针强制转换 void指针又名万能指针,在现在的很多程序中,当参数不确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。ANSIC规定,void指针可以复制给其他任意类型的指针,其他任意类型的指针也可以复制给void指针,指针是一个存储数据地址空间的变量,指针在工作时可以根据指针类型确定数据的字节大小,根据指针变量中存储的地址空间提取数据。p1存储的地址为a的低地址空间,char类型占1个字节,所以只读取1025的低四位。指针类型的p1可以直接打印指针指向的值,而void。... 阅读详情

相关推荐

Java类型转换全解析:自动转换与强制转换的底层逻辑与避坑指南

在强类型编程语言中,类型转换是连接数据声明与内存解释的桥梁,也是每个开发者从基础语法迈向工程实践都绕不开的核心机制。类型就好比容器的契约:自动转换解决的是编译器可确认的“装得下、不改变语义”的场景,比如基本数据类型沿byte→short→int→long→float→double的隐式提升,以及引用类型中基于继承关系的向上转型;而强制转换则是在编译器无法自证安全时,由开发者显式声明“我比编译器更了解真实对象类型”的冒险操作。理解两者的边界至关重要——向下转型若缺少instanceof校验,极易在运行期触发C

weixin_34072296的博客 174

给小白的Java EE指南(2)

接上篇《给小白的Java EE生存指南》 , 你可以通过公共号的消息历史中查看。 今天继续聊Web的事情。 上次说到你发明了html , http, 浏览器, web...

码农翻身 301

JT 转换为 CATIA 全流程:迪威模型网在线转换实战指南

JT格式凭借轻量化、跨平台特性成为制造业协同评审的核心载体,而CATIA原生格式则是高精度设计的全信息载体。本文详解通过迪威模型网在线转换JT到CATIA格式的方法,包括文件上传、参数配置、结果验证等步骤,并针对常见问题提供解决方案。同时指出转换后可能存在的参数化特征丢失、曲面精度偏差等边界问题,给出预处理建议。最后对比了CATIA本地导入和专业工具转换等替代方案,根据不同应用场景推荐最优转换方式。文章强调转换前需用JT2Go检查文件完整性,转换后应重点验证装配结构和几何精度,为专业技术人员提供实用指导。

技术说明博主 1365

07-撩课JavaEE-反射

一、类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中 系统会通过加载,连接,初始化三步来实现对这个类进行初始化 加载 就是指将class文件读入内存 并为之创建一个Class对象。 任何类被使用时系统都会建立一个Class对象。 连接 验证 是否有正确的内部结构, 并和其他类协调一致 准备 负责为类的静态成员分配内存, 并设置默认初始化值 初始...

lkitlike的博客 293

C# JSON反序列化:JObject强制转换异常分析与解决方案

JSON作为现代应用数据交换的核心格式,其序列化与反序列化是软件开发中的基础操作。在C#生态中,Newtonsoft.Json(Json.NET)通过将JSON字符串转换为内存对象实现数据绑定,这一过程涉及类型系统映射与数据格式解析。当开发者尝试将动态JSON容器JObject直接强制转换为自定义强类型时,会触发InvalidCastException,这源于C#强类型系统与动态数据结构间的本质差异。理解JObject作为动态查询容器的本质,掌握ToObject<T>()方法进行安全转换,能有效避免类型转换

weixin_33770878的博客 481

SolidWorks转CATIA的3种实用方法对比:本地转换vs在线工具(附迪威模型网实测)

本文深入对比了SolidWorks转CATIA的3种实用方法,包括本地转换和在线工具(如迪威模型网),帮助工程师在不同场景下选择最优解。通过详细的技术指南和实测数据,分析了几何完整性、数据精度和操作效率等核心挑战,提供了针对性的解决方案和决策框架。

silver的专栏 698

ESXi厚置备转精简置备:无损在线转换实战指南

虚拟磁盘置备模式是vSphere存储管理的基础概念,厚置备与精简置备的核心差异在于空间分配时机和物理块占用逻辑。厚置备磁盘(尤其是zeroedthick)在创建时即锁定全部容量,导致存储利用率虚高;而精简置备通过按需分配块、动态映射LBA,实现物理空间高效复用。该技术依托VMFS文件系统对稀疏文件的支持及vmkfstools的原子级块映射重写能力,在ESXi 7.0+中支持无停机、不丢失快照链、不改变UUID的原地转换。典型应用于存储告警应急、VMFS数据存储空间优化、老旧厚置备磁盘治理等生产场景,是vSp

weixin_29305313的博客 284

不用装PROE也能转STP!5个免费在线转换工具横向评测(含批量处理技巧)

本文针对设计师、工程师常遇到的PROE文件转换STP格式难题,横向评测了五款免费在线转换工具。评测涵盖转换质量、文件限制、处理速度及核心的批量处理能力,并提供了不同场景下的选择指南与实用技巧,帮助用户高效、安全地解决格式转换问题。

weixin_29310605的博客 450

REVIT 与 SOLIDWORKS 模型转换实战:从本地处理到在线工具的高效指南

本文详细解析了REVIT与SOLIDWORKS模型转换的核心挑战与高效解决方案,涵盖本地处理技巧和在线工具(如迪威模型网)的实战评测。通过预处理检查清单、格式选择策略及参数化重建方法,帮助工程师克服37%的几何特征修复难题,提升跨平台协作效率。

weixin_30296405的博客 491

CAD文件转换终极指南:从IGS到SOLIDWORKS的3种方法实测(含在线工具)

本文详细介绍了将IGS文件转换为SOLIDWORKS格式的3种实用方法,包括本地软件直接转换、专业工具链(如Catia V5中转)以及在线转换平台(如迪威模型网)的实测对比。通过优化参数设置、中转处理和在线工具选择,显著提升转换精度和效率,适用于工业设计、机械工程等领域的复杂模型处理需求。

desk3的博客 558

IIS部署SSL证书全指南:从PFX转换到HTTPS强制跳转

SSL证书是保障网站数据传输安全的基础,通过公钥加密技术实现客户端与服务器之间的端到端加密,HTTPS已成为现代网站的标配。在Windows Server环境下,IIS作为主流Web服务器,其证书部署流程与Nginx等存在显著差异,尤其在PFX格式处理、证书存储和绑定机制上。理解这些基础原理有助于快速定位部署中的问题,如私钥权限、证书链不完整等。当企业申请或续期证书后,正确导入并绑定到IIS,同时启用HTTP到HTTPS的301跳转和HSTS策略,才能确保全站加密访问。本文从格式转换、导入绑定、常见故障排查

weixin_30745553的博客 326

告别在线转换器:用开源工具本地搞定PDF、图片与音视频转换

格式转换是日常办公中的高频需求,但网页工具常常以页数、体积、速度为由设置付费墙,甚至泄露隐私。其实,转换的本质不是改后缀,而是对文件进行解码与重编码,理解这一点就能绕开陷阱。开源工具如ImageMagick、FFmpeg、poppler等,通过命令行实现本地批量处理,不限制次数、无需上传,兼顾效率与安全。从图片批量转JPG、PDF拆页渲染到音视频转码,均能构建可重复执行的本地工作流。无论是PDF转Word还是其他格式转换,掌握工具背后的原理和适用边界,才能真正摆脱会员制束缚。本文以工程实践视角,解析如何用开

weixin_34221112的博客 544

告别转换限制:实测一款真正免费的Geojson转Shapefile/KML在线工具

本文实测了Quickmaptools这款真正免费的Geojson转Shapefile/KML在线工具,解决了地理空间数据从业者面临的转换次数限制和隐性收费问题。工具支持大文件转换、多格式同步输出,且完全匿名使用,特别适合教育科研和个人项目开发场景。

weixin_29201933的博客 96

微信wxid在线转换技术解析与企业应用实践

用户唯一标识符(UID)是各类互联网系统的核心设计要素,微信采用wxid作为底层不可变的用户标识。通过哈希算法、Base64编码等技术可实现标识符的安全转换,这种技术在系统集成、数据分析等场景具有重要价值。特别是在企业微信生态中,wxid转换服务能有效解决用户身份映射问题,本文介绍的微信官方API转换方案采用Python实现,包含access_token鉴权、异常处理等关键模块,同时强调必须遵循用户授权、数据脱敏等合规要求。实际应用中需注意API调用频率限制、缓存策略优化等工程实践要点。

weixin_30437847的博客 457

SOLIDWORKS新手必看:3种STP文件导入方法对比(含在线转换技巧)

本文为SOLIDWORKS新手详细对比了3种STP文件导入方法,包括原生导入功能、第三方转换工具和在线转换技巧。特别介绍了迪威转换器的隐藏功能和在线转换的实战指南,帮助用户根据场景选择最佳方案,提升工作效率。

weixin_29252171的博客 580

不用UG软件也能转IGS?迪威模型网在线转换全流程实测与性能对比

本文详细评测了5种无需UG软件即可在线转换IGS格式的高效解决方案,重点分析了迪威模型网的全流程操作与性能表现。通过实测数据对比和实用技巧分享,帮助用户在不同场景下选择最佳转换工具,实现跨平台CAD协作的无缝衔接。

weixin_28340315的博客 226

stm32实现简易程序在线更新的原理简述

stm32要想更新程序,一般的做法就是用j-link或者串口下载。那可不可以实现不限通信方式,实现在线更新呢?为了实现在线更新的这个功能,我写了一段简易的类似BootLoader的程序。原理就是在应用程序执行之前添加一段代码,可以选择一种通信方式来接收新的应用编译完成生成的bin文件,然后固化到flash中,并跳转到应用程序中执行相应代码。又在应用程序代码中给出了一个接口,在执行应用程序的时候也可以

Andy123321aa的博客 3356

在线工具为何不待见WAV?从底层原理到格式转换实战解析

在音频处理与在线协作日益频繁的今天,理解不同封装格式的底层特性是高效工作的基础。WAV 作为最经典的无损格式,依靠 PCM 脉冲编码调制实现零损耗采样,但未压缩的设计也使其数据量极为庞大,在浏览器环境下面临带宽、内存和解析性能的多重限制。相比之下,MP3 和 FLAC 分别以有损压缩与无损压缩的方式平衡了体积与音质,更适合在线传输和快速编辑。实际工程中,用户可借助格式转换工具将 WAV 转为 FLAC 进行无损中间处理,或转为高码率 MP3 满足流媒体发布需求,从而避开在线工具对 WAV 文件的兼容瓶颈。本

weixin_31749299的博客 242
上一篇: 给小白的Java EE指南(5) : AJAX
下一篇: 手机端应用怎么访问服务器?
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值