Java反射用法1 : Class

2018-04-03  本文已影响0人  厨房里的工程师

一、为什么需要反射?

反射(Reflection)是Java语言的高级特性之一,它允许程序在运行时获取自身信息,比如获取对象的成员(Class members),构造器等。同时,程序也可以在运行时进行如下操作:

以下是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

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). 通过ClassgetModifiers()获取修饰器

Class c = String.class;
int modifiers = c.getModifiers();

所有的修饰器都被转换成了一个数字值,可以通过toString()方法获得修饰器名:

modifiers.toString();

还可以检查修饰器是否属于某种特殊的类型:

Modifier.isAbstract(modifiers);
Modifier.isFinal(modifiers);
Modifier.isNative(modifiers);
...

(2). 通过ClassgetSuperclass()方法获取父类

Class c = String.class; // 获取类名
Class superclass = c.getSuperclass();

(3). 通过ClassgetPackage()获取Package信息

Package package = c.getPackage();

(4). 通过ClassgetConstructors()方法来获取构造器

c.getConstructors();

3. 获取类成员的方法

(1). 通过ClassgetMethods()方法获取类的方法

Method[] methods = c.getMethods();

(2). 通过ClassgetFields()方法获取类的成员变量

Field[] fields = c.getFields();

三、小结

获取类成员将在另一篇文章中总结。

参考文献


  1. Java Reflection Classes
  2. Java Reflection Documentation
上一篇 下一篇

猜你喜欢

热点阅读