RTTI 运行时类型信息 与 Reflect 反射

简介: RTTI,Run Time Type Information,运行时类型信息。 要理解RTTI在java中的工作原理,必须知道 类型信息 在 运行时 是如何表示的。每个类都有一个字段“Class class;”,好晕啊,类名和对象名一样。 每当编写并编译了一个新类,就会产生一个Class对象,被保存在同名的.class文件中。JVM的类加载器会去用它。 1.Class public

RTTI,Run Time Type Information,运行时类型信息。

要理解RTTI在java中的工作原理,必须知道 类型信息 在 运行时 是如何表示的。每个类都有一个字段“Class class;”,好晕啊,类名和对象名一样

每当编写并编译了一个新类,就会产生一个Class对象,被保存在同名的.class文件中。JVM的类加载器会去用它。

1.Class

public final class Class<T> implements java.io.Serializable, GenericDeclaration,Type,AnnotatedElement{}

这是Class类的定义。

Class<?> java.lang.Class.forName(String className)

这个静态方法可以取得Class对象的引用,参数必须为完全限定名。

String java.lang.Class. getSimpleName()
不含包名的类名。
String java.lang.Class. getName()

全限定的类名。

1.1 构造函数

java.lang.reflect.Constructor<T>

代表类型T的构造函数。

Constructor<T> java.lang.Class.getDeclaredConstructor(Class<?>... parameterTypes) 

获得构造函数。

Object java.lang.reflect.Constructor.newInstance(Object... initargs) 

通过构造函数获得新对象。

1.2函数

java.lang.reflect.Method

表示类或接口的一个方法。
Method java.lang.Class. getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
得到当前类的指定方法。
Object java.lang.reflect.Method. invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

在对象obj上调用这个方法。

void java.lang.reflect.AccessibleObject.setAccessible(boolean flag)

Field与Method类都继承了AccessibleObject。所以可以使用这个方法将访问权限从private改为public,再干想干的事,多棒啊。

1.3字段

java.lang.reflect.Field

表示类或接口的一个字段。

Field[] java.lang.Class.getFields()

返回所有public权限的字段。

Field java.lang.Class.getField(String name)
返回名为name的Field对象,只对public权限的字段有效。

Field[] java.lang.Class.getDeclaredFields()

返回所有声明的字段,即便private权限也有效。

Field java.lang.Class.getDeclaredField(String name) 

返回名为name的Field对象,即便private权限也有效。
double java.lang.reflect.Field.getDouble(Object obj) 
一批类似方法有getDouble\getInt\getLong等。返回obj对象的这个字段的值。
Object java.lang.reflect.Field.get(Object obj)
对于非基本类型,返回obj对象的这个字段的值。

2.获取class与创建对象

微笑问:有哪些方法可以获得一个类的Class对象呢?
答:有三种,class.forName(‘类的完全限定名’),类名.class,对象.getClass()。
微笑问:java创建对象的方法有几种?
答:4中。new 一个对象,反序列化一个对象,通过clone()得到对象,通过反射newInstance()创建对象。

3.对象转换

两个类A与B,字段完全一致,现有 A的对象a,如何快速构造一个B类的b对象?


目录
相关文章
|
存储 数据可视化 数据处理
Python中读取Excel文件的方法
【2月更文挑战第18天】
1527 4
Python中读取Excel文件的方法
|
4月前
|
人工智能 程序员 开发者
「超级开发个体」在诞生:一份白皮书带你理解AI时代开发者
10月24日程序员节,魔搭社区联合知乎发布《THE NEXT WAVE:AI时代开发者生态白皮书》,揭示AI时代开发者新画像:以“超级个体”为核心,兼具技术与商业闭环能力,工具平权让个人开发者崛起。报告涵盖年龄、学历、组织分布及认知行为特征,展现开发者如何用AI提效、实现从“写代码”到“搭系统”的跃迁。点击下载完整报告。
367 0
|
11月前
|
运维 Oracle 关系型数据库
YashanDB演讲实录|王南:YAC集群,核心平替
本文分享了“2024国产数据库创新生态大会”上,深算院首席产品官兼崖山科技副总裁王南的演讲实录,主题为《YAC集群,核心平替》。文章深入探讨了数据库行业面临的规模化应用挑战,提出崖山数据库在核心技术、团队实力和商业化能力上的优势。崖山通过YashanDB V23版本,正式发布共享集群LTS版本、Oracle 99%兼容、MySQL生态支持、私有云管平台及数据库一体机等创新成果,提供高性价比的平替方案。同时,崖山全面开放V23版本下载,携手200多家生态伙伴加速商业落地,助力国产数据库迈向大规模应用新时代。
|
机器学习/深度学习 机器人
《解密奖励函数:引导智能体走向最优策略》
在强化学习中,奖励函数是核心要素,指导智能体学习与决策。它通过明确目标、合理分配奖励和考虑环境因素,激励智能体探索最优策略。设计恰当的奖励函数能让智能体在复杂环境中不断优化行为,实现长期目标。即时、延迟和全局奖励的不同类型,以及奖励函数的稳定性和适应性,都是设计时需关注的重点。
574 13
|
Linux C# Windows
.NET使用MiniWord高效生成Word文件
.NET使用MiniWord高效生成Word文件
507 12
|
算法 测试技术
【深度优先搜索篇】带你暴力dfs去破解飞机降落和八皇后问题(轻松拿捏版)
【深度优先搜索篇】带你暴力dfs去破解飞机降落和八皇后问题(轻松拿捏版)
|
算法 搜索推荐
如何用CRDT算法颠覆文档协作模式?
在局域网环境下,高效文档协同编辑面临版本冲突等核心技术挑战,影响协作效率和成果质量。为解决此问题,可采用基于CRDT的算法,允许多用户无冲突实时编辑;或将协同操作模块化,通过任务看板优化协作流程,减少冲突,提高团队效率。未来,局域网协同编辑将更加场景化与个性化,深入探索组织协作文化。
|
API Anolis 开发者
Intel® oneAPI 在龙蜥社区里面的支持情况分享|龙蜥大讲堂116期
本次分享的主题是 Intel® oneAPI 在龙蜥社区里面的支持情况分享。主要分为四个部分: 1. What is Intel® oneAPI 2. Intel® oneAPI infrastructure 3. Anolis Intel® oneAPI enabling status 4. Qwen2 demo
478 0
|
存储 编解码 安全
阿里云服务器2核4G、4核8G、8核16G配置租用收费标准与活动价格参考
通常情况下,个人和一般企业用户在购买阿里云服务器时比较喜欢购买2核4G、4核8G、8核16G等配置,这些配置既能满足各种图文类中小型网站和应用又能满足企业网站应用、批量计算、中小型数据库系统等场景,2核4G配置适合新手入门或初创企业,4核8G与8核16G兼具成本与性能优势,适合通用场景,本文介绍这些配置的最新购买价格,包含原价收费标准和最新活动价格。

热门文章

最新文章