Java反射机制API

实现Java反射机制的类都位于java.lang.reflect包中,java.lang.Class类是Java反射机制API中的核心类。本节将从这两个方面讲解Java反射机制API。

java.lang.Class类

java.lang.Class类是实现反射的关键所在,Class类的一个实例表示Java的一种数据类型,包括类、接口、枚举、注解(Annotation)、数组、基本数据类型和void。Class没有公有的构造方法,Class实例是由JVM在类加载时自动创建的。

在程序代码中获得Class实例可以通过如下代码实现:

// 1. 通过类型class静态变量Class clz1 = String.class;
String str = "Hello";// 2. 通过对象的getClass()方法Class clz2 = str.getClass();12345复制代码类型:[java]

每一种类型包括类和接口等,都有一个class静态变量可以获得Class实例。另外,每一个对象都有getClass()方法可以获得Class实例,该方法是由Object类提供的实例方法。

Class类提供了很多方法可以获得运行时对象的相关信息,下面的程序代码展示了其中一些方法。

public class ReflectionTest01 { public static void main(String[] args) {  // 获得Class实例
  // 1.通过类型class静态变量
  Class clz1 = String.class;
  String str = "Hello";  // 2.通过对象的getClass()方法
  Class clz2 = str.getClass();  // 获得int类型Class实例
  Class clz3 = int.class;  // 获得Integer类型Class实例
  Class clz4 = Integer.class;
  System.out.println("clz2类名称:" + clz2.getName());
  System.out.println("clz2是否为接口:" + clz2.isInterface());
  System.out.println("clz2是否为数组对象:" + clz2.isArray());
  System.out.println("clz2父类名称:" + clz2.getSuperclass().getName());
  System.out.println("clz2是否为基本类型:" + clz2.isPrimitive());
  System.out.println("clz3是否为基本类型:" + clz3.isPrimitive());
  System.out.println("clz4是否为基本类型:" + clz4.isPrimitive());
 }
}123456789101112131415161718192021复制代码类型:[java]

运行结果如下:

clz2类名称:java.lang.String
clz2是否为接口:falseclz2是否为数组对象:falseclz2父类名称:java.lang.Object
clz2是否为基本类型:falseclz3是否为基本类型:trueclz4是否为基本类型:false1234567复制代码类型:[java]

注意上述代码第10行和第12行的区别。int是基本数据类型,所以输出结果为true;Integer是类,是引用数据类型,所以输出结果为false。

java.lang.reflect包

java.lang.reflect包提供了反射中用到类,主要的类说明如下:

Constructor类:提供类的构造方法信息。

Field类:提供类或接口中成员变量信息。

Method类:提供类或接口成员方法信息。

Array类:提供了动态创建和访问Java数组的方法。

Modifier类:提供类和成员访问修饰符信息。

示例代码如下:

public class ReflectionTest02 { public static void main(String[] args) {  try {   // 动态加载xx类的运行时对象
   Class c = Class.forName("java.lang.String");   // 获取成员方法集合
   Method[] methods = c.getDeclaredMethods();   // 遍历成员方法集合
   for (Method method : methods) { // 打印权限修饰符,如public、protected、private
 System.out.print(Modifier.toString(method.getModifiers())); // 打印返回值类型名称
 System.out.print(" " + method.getReturnType().getName() + " "); // 打印方法名称
 System.out.println(method.getName() + "();");
   }
  } catch (ClassNotFoundException e) {
   System.out.println("找不到指定类");
  }
 }
}12345678910111213141516171819202122复制代码类型:[java]

上述代码第5行是通过Class的静态方法forName(String)创建某个类的运行时对象,其中的参数是类全名字符串,如果在类路径中找不到这个类则抛出ClassNotFoundException异常,见代码第17行。

代码第7行是通过Class的实例方法getDeclaredMethods()返回某个类的成员方法对象数组。代码第9行是遍历成员方法集合,其中的元素是Method类型。

代码第11行的method.getModifiers()方法返回访问权限修饰符常量代码,是int类型,例如1代表public,这些数字代表的含义可以通过Modifier.toString(int)方法转换为字符串。代码第13行通过Method的getReturnType()方法获得方法返回值类型,然后再调用getName()方法返回该类型的名称。代码第15行method.getName()返回方法名称。

(0)

相关推荐

  • Java反射

    一.概念 运行状态中知道类所有的属性和方法. 在Java中的反射机制是指在运行状态中,对于任意一个类都能知道这个类的所有属性和方法,并且对于任意一个对象,都能调用它的任意一个方法.这种能够获取信息以及 ...

  • 110_注解和反射

    什么是注解 Annotation是从JDK5.0开始引入的技术. Annotation的作用: 不是程序本身,可以对程序作出解释.(这一点和注释一样) 可以被其他程序(如:编译器等)读取. Annot ...

  • (16条消息) 【小家Java】你真的了解Java泛型参数吗?细说java.lang.reflect.Type(ParameterizedType、TypeVariable、WildcardType...)

    每篇一句 不要每天看着励志的句子,过着颓废的生活 前言 咋一看标题,你可能会说.不就是泛型吗,平时都使用着呢,没什么难的吧. 感觉了解了,但是真正的深入才知道自己了解甚少! 没有泛型的时候,只有原始类 ...

  • Java反射机制是什么?

    Java反射机制是Java语言的一个重要特性.在学习Java反射机制前,大家应该先了解两个概念,编译期和运行期. 编译期是指把源码交给编译器编译成计算机可以执行的文件的过程.在Java中也就是把Jav ...

  • Android插件化开发基础之Java反射机制研究

    一.获得Class对象 Class<?> c = Class.forName("classname"); 抛出ClassNotFoundException 二.获得实现 ...

  • java中的反射机制

    前言: ​相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解AP ...

  • 推荐一款 Java 零注解 API 文档生成工具

    smart-doc 是一款同时支持 java restful api 和 Apache Dubbo rpc 接口文档生成的工具,smart-doc 颠覆了传统类似 swagger 这种大量采用注解侵入 ...

  • Java编程开发之浅析Java引用机制

    对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象:一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java ...

  • Java SPI机制详解

    SPI介绍 SPI ,全称为 Service Provider Interface,是一种服务发现机制,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件. SPI的 ...

  • Java事件处理机制

    Java事件处理机制 Java事件处理机制涉及三个成员:事件源.事件和事件监听器 事件源:Java的AWT或Swing组件,该组件就是事件源,通过new关键字即可创建 事件:由系统自动产生 事件监听器 ...

  • 小白也能看懂的Java异常处理机制

    异常处理是开发过程中不可或缺的一部分,用户希望看到一个可以接受的错误信息,开发运维人员也希望可以看到详细的错误信息.因此在开发过程中,应重视异常处理.异常处理过程中有几个常见的乱象,例如没有固定的规范 ...