Java反射
反射
反射:能够分析类能力的程序称为反射。
在Java中提供了一个反射库,里面涵盖了大量的丰富精巧的工具集,可以用来编写能够动态操纵Java代码的程序。
在之后的文章中将会介绍到反射的功能:
- 在运行时分析类的能力
- 在运行时检查对象
- 实现泛型数组的操作代码(用反射机制动态扩充数组容量)
- 利用Method对象
class类
在程序运行期间,Java运行是系统始终为所有对象维护一个运行时类型表示。
注意这里并不是类标识而是类型标识,也就是说class类描述的不仅仅是类,也可以是Java普通的数据类型,这里后面会涉及到。
这个信息会跟踪每个对象所属的类。对于每个类的信息就保存在类名为Class的类中,这名字会让人有些困惑。
Employee e; Class cl = e.getClass();
就像Employee对象描述一个具体的特定员工一样,Class对象会描述一个特定类的属性。简单的来说,就是一个Class对象就对应一个类,并且Class对象中包含了随对应类的全部信息。 上述,getClass()方法就是最常用的方法,这会返回一个类的名字。
需要说明的是,如果被描述的类在一个包里,包的名字也会作为类名的一部分。
获取Class类对象的方法有三种:
- 对象.getClass()
- 使用Class类的静态方法 Class.forName("className")
- T.class(其中T代表了任意的Java类型或void关键字),T.class代表匹配的类对象。
```java Class cl1 = int.class(); ```
这就是之前所说的Class类是维护的运行时类型标识而不是类的表示,因为这里int并不是一个 >类,而是一个Java的类型。
一个Class对象实际上表示的是一个类型,这可能是类,也可能不是类。
虚拟机为每一个类型管理一个唯一的Class对象,因此可以用==运算符实现两个类对象(即Class类的实例)的比较。
例如:
if(e.getClass() == Employee.class) ...
如果e是一个Employee的实例,这个测试将通过。与条件e instanceof Employee不同,如果e是Employee的子类这个测试将不通过。
这里简单接受一下instanceof的功能,搜先instance是实例,例子的意思(
我去百度翻译查的,我相信一定有和我一样的英语渣渣),对象运算符(instanceof)用来判断一个对象是否属于某个指定的类或其子类的实例,如果是,返回真(true),否则返回假(false)。
最后来说一下通过Class对象来调用被描述对象的无参构造函数,实例化对象的方法。
getConstructor将返回一个Constructor类型的对象,然后使用一个newInstance方法来构造一个实例。
var classname = "java.util.Random"; Class cl = class.forName(classname); Object obj = cl.getConstructor().newInstance();
注意这个类如果没有无参构造函数将会抛出一个异常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!