加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Java反射机制API

发布时间:2022-07-13 20:02:39 所属栏目:语言 来源:互联网
导读:实现 Java 反射机制的类都位于 java.lang.reflect 包中,java.lang.Class 类是 Java 反射机制 API 中的核心类。本节将从这两个方面讲解 Java 反射机制 API。 可参考《Java反射机制的基本概念》一节中介绍的关于 Java 反射机制获取类对象相关信息的方法,来
  实现 Java 反射机制的类都位于 java.lang.reflect 包中,java.lang.Class 类是 Java 反射机制 API 中的核心类。本节将从这两个方面讲解 Java 反射机制 API。
  可参考《Java反射机制的基本概念》一节中介绍的关于 Java 反射机制获取类对象相关信息的方法,来学习本节内容。
 
  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();
 
  每一种类型包括类和接口等,都有一个 class 静态变量可以获得 Class 实例。另外,每一个对象都有 getClass() 方法可以获得 Class 实例,该方法是由 Object 类提供的实例方法。
 Java反射机制API
  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());
      }
  }
  运行结果如下:
  clz2类名称:java.lang.String
  clz2是否为接口:false
  clz2是否为数组对象:false
  clz2父类名称:java.lang.Object
  clz2是否为基本类型:false
  clz3是否为基本类型:true
  clz4是否为基本类型:false
 
  注意上述代码第 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("找不到指定类");
          }
      }
  }
  上述代码第 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()返回方法名称。

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!