一、为什么需要反射?
反射(Reflection)是Java语言的高级特性之一,它允许程序在运行时获取自身信息,比如获取对象的成员(Class members),构造器等。同时,程序也可以在运行时进行如下操作:
- 判断一个实例的所属类
- 获取并初始化类的成员变量(field)
- 获取并调用类的方法
- 获取并调用类的构造器
以下是Java 8对反射的介绍:
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.
本文主要讨论反射与Class对象:
- 获取Class对象
- 查看类的修饰器和类型
- 获取类成员的方法
二、反射与Class
1. 如何获取Class对象?
(1). 通过对象的某个实例调用getClass()
方法
jshell> Class c = "Str".getClass();
c ==> class java.lang.String
jshell> int[] intArray = new int[10];
intArray ==> int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
jshell> Class c = intArray.getClass();
c ==> class [I
注意:
Primitive类型变量无法调用getClass()
方法,因为Primitive类型不是对象,而getClass()
是Object
中的方法。
(2). 直接在类名称后添加.class
jshell> Class c = boolean.class;
c ==> boolean
jshell> Class c = String.class;
c ==> class java.lang.String
该方法也可以用来获取多维数组的类:
jshell> Class c = int[][][].class
c ==> class [[[I
Primitive类型则可以通过调用TYPE
方法来获取:
jshell> Class c = Integer.TYPE;
c ==> int
(3). 调用Class
类的forName()
方法
jshell> Class c = Class.forName("java.lang.String");
c ==> class java.lang.String
注意,调用
forName()
方法时一定要给出类完整的名字,不然编译器会抛出异常ClassNotFoundException
.
2. 查看类的修饰器(Modifier)和类型(Type)
(1). 通过Class
的getModifiers()
获取修饰器
Class c = String.class;
int modifiers = c.getModifiers();
所有的修饰器都被转换成了一个数字值,可以通过toString()
方法获得修饰器名:
modifiers.toString();
还可以检查修饰器是否属于某种特殊的类型:
Modifier.isAbstract(modifiers);
Modifier.isFinal(modifiers);
Modifier.isNative(modifiers);
...
(2). 通过Class
的getSuperclass()
方法获取父类
Class c = String.class; // 获取类名
Class superclass = c.getSuperclass();
(3). 通过Class
的getPackage()
获取Package信息
Package package = c.getPackage();
(4). 通过Class
的getConstructors()
方法来获取构造器
c.getConstructors();
3. 获取类成员的方法
(1). 通过Class
的getMethods()
方法获取类的方法
Method[] methods = c.getMethods();
(2). 通过Class
的getFields()
方法获取类的成员变量
Field[] fields = c.getFields();
三、小结
获取类成员将在另一篇文章中总结。
网友评论