Java反射用法1 : Class

一、为什么需要反射?

反射(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). 通过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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,031评论 0 3
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 1,844评论 0 10
  • 本篇文章已授权微信公众号guolin_blog(郭霖)独家发布 转载请注明出处:https://www.jians...
    ming152阅读 6,846评论 4 79
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,788评论 0 9
  • 两年前,工作原因,结婚一年多的丈夫要去他的出生地的那个偏远的县城做事,开车的话三个多小时,坐汽车的话吃完中午饭去坐...
    细细粒妈咪阅读 210评论 0 1