美文网首页
Java反射用法1 : Class

Java反射用法1 : Class

作者: 厨房里的工程师 | 来源:发表于2018-04-03 14:47 被阅读0次

一、为什么需要反射?

反射(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

相关文章

  • Java反射用法1 : Class

    一、为什么需要反射? 反射(Reflection)是Java语言的高级特性之一,它允许程序在运行时获取自身信息,比...

  • java 反射

    java 反射 Class 类介绍 以下所有大写的 Class 都表示 java.lang.Class 1.jav...

  • java 反射基础

    1.java反射基础 2.java反射进阶 反射的两个显著的作用 反编译: .class —> .java 通过...

  • Java学习之反射

    一、Class 1、概述: 1、Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java反射总结归纳

    Java的反射很重要作用有两个获取反射类型和反射调用(下面我会都说到,网上大多说的用法不全面) 获取Class c...

  • Java反射-2(技巧)

    Java反射-1(理论)Java反射-2(技巧) Java语言是把Java源文件编译成后缀为class的字节码文件...

  • 新鲜出炉,深入讲解java反射的底层原理,这篇算讲的不错了!

    反射 反射 Java代码和Java文件 Java文件和.class字节码文件 class字节码文件在内存中的位置 ...

  • Java反射由浅入深

    分享一下学习反射的笔记,了解反射之前要先了解一下java的class类。 1. Class类 Java除了基本类型...

  • 无处不在的反射

    本文不讲反射的具体实现。 1.反射的原理 - class对象 11)class对象概述 编译阶段,编译器将java...

网友评论

      本文标题:Java反射用法1 : Class

      本文链接:https://www.haomeiwen.com/subject/ciqicftx.html