关于Java反射机制的几个问题
1.如何在运行时确定对象类型
运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,
一种是在编译时和运行时已经知道了所有的类型,另外一种是反射机制。
类型信息在运行时是如何表示的,是由Class对象完成的,它包含了与类有关的信息。
类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中。
在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,
如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
一般的RTTI形式包括三种:
(1)通过传统的类型转换是否成功判断
如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。
(2)通过Class对象来获取对象的类型
1 2 | Class c = Class.forName(“Apple”); Object o = c.newInstance(); |
(3)通过关键字instanceof或Class.isInstance()方法来确定对象是否属于某个特定类型的实例
准确的说,应该是instanceof / Class.isInstance()可以用来确定对象是否属于某个特定类及其所有父类的实例,
注意和equals() / ==区分,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。
2.Class下的newInstance()和new()有什么区别
首先,newInstance( )是一个方法,而new是一个关键字,
其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用new关键字生成对象没有这个限制。
总结如下:
Class.forName("")返回的是类;
Class.forName("").newInstance()返回的是Object。
3.理解Class.forName()方法
一般来说,使用Class.forName( )静态方法的目的是为了动态加载类,
在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。
因此,使用Class.forName( )最终目的是为了实例化对象。
本文来自博客园,作者:邴越,转载请注明原文链接:https://www.cnblogs.com/binyue/p/5324022.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南