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();
注意这个类如果没有无参构造函数将会抛出一个异常。
浙公网安备 33010602011771号