Java反射

反射

反射:能够分析类能力的程序称为反射。

在Java中提供了一个反射库,里面涵盖了大量的丰富精巧的工具集,可以用来编写能够动态操纵Java代码的程序。

在之后的文章中将会介绍到反射的功能:

  • 在运行时分析类的能力
  • 在运行时检查对象
  • 实现泛型数组的操作代码(用反射机制动态扩充数组容量)
  • 利用Method对象

class类

在程序运行期间,Java运行是系统始终为所有对象维护一个运行时类型表示。

注意这里并不是类标识而是类型标识,也就是说class类描述的不仅仅是类,也可以是Java普通的数据类型,这里后面会涉及到。
这个信息会跟踪每个对象所属的类。对于每个类的信息就保存在类名为Class的类中,这名字会让人有些困惑。

Employee e;
Class cl = e.getClass();

就像Employee对象描述一个具体的特定员工一样,Class对象会描述一个特定类的属性。简单的来说,就是一个Class对象就对应一个类,并且Class对象中包含了随对应类的全部信息。 上述,getClass()方法就是最常用的方法,这会返回一个类的名字。

需要说明的是,如果被描述的类在一个包里,包的名字也会作为类名的一部分。

获取Class类对象的方法有三种:

  1. 对象.getClass()
  2. 使用Class类的静态方法 Class.forName("className")
  3. 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();

注意这个类如果没有无参构造函数将会抛出一个异常。

posted @   破忒头头  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示