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

Java反射机制API

发布时间:2022-10-25 11:18:07 所属栏目:语言 来源:
导读:  实现 Java 反射机制的类都位于 java.lang.reflect 包中,java.lang.Class 类是 Java 反射机制 API 中的核心类。本节将从这两个方面讲解 Java 反射机制 API。
  可参考《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()返回方法名称。
 

(编辑:云计算网_汕头站长网)

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