一此再、為什么需要反射饵较?
反射(Reflection)是Java語言的高級特性之一,它允許程序在運行時獲取自身信息镐捧,比如獲取對象的成員(Class members)潜索,構(gòu)造器等。同時懂酱,程序也可以在運行時進行如下操作:
- 判斷一個實例的所屬類
- 獲取并初始化類的成員變量(field)
- 獲取并調(diào)用類的方法
- 獲取并調(diào)用類的構(gòu)造器
以下是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). 通過對象的某個實例調(diào)用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類型變量無法調(diào)用getClass()
方法列牺,因為Primitive類型不是對象由驹,而getClass()
是Object
中的方法。
(2). 直接在類名稱后添加.class
jshell> Class c = boolean.class;
c ==> boolean
jshell> Class c = String.class;
c ==> class java.lang.String
該方法也可以用來獲取多維數(shù)組的類:
jshell> Class c = int[][][].class
c ==> class [[[I
Primitive類型則可以通過調(diào)用TYPE
方法來獲取:
jshell> Class c = Integer.TYPE;
c ==> int
(3). 調(diào)用Class
類的forName()
方法
jshell> Class c = Class.forName("java.lang.String");
c ==> class java.lang.String
注意蔓榄,調(diào)用
forName()
方法時一定要給出類完整的名字并炮,不然編譯器會拋出異常ClassNotFoundException
.
2. 查看類的修飾器(Modifier)和類型(Type)
(1). 通過Class
的getModifiers()
獲取修飾器
Class c = String.class;
int modifiers = c.getModifiers();
所有的修飾器都被轉(zhuǎn)換成了一個數(shù)字值,可以通過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()
方法來獲取構(gòu)造器
c.getConstructors();
3. 獲取類成員的方法
(1). 通過Class
的getMethods()
方法獲取類的方法
Method[] methods = c.getMethods();
(2). 通過Class
的getFields()
方法獲取類的成員變量
Field[] fields = c.getFields();
三甥郑、小結(jié)
獲取類成員將在另一篇文章中總結(jié)逃魄。