亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

精通 Java 反射 API:实战指南与代码示例

什么是 Java 反射?

Java 反射是在运行时分析和修改类所有能力的过程。反射 API 用于在运行时操作类及其成员,包括字段、方法、构造器等。

反射 API 优势之一:能操作类的私有成员。

java.lang.reflect 包提供多类实现反射。java.lang.Class 类方法用于收集特定类的完整元数据。

本教程学习:

java.lang.reflect 包中的类

实现反射的各类:

java.lang.Class 常用方法

如何获取类完整信息

获取类的变量、方法、构造器信息,需创建类对象。

精通 Java 反射 API:实战指南与代码示例

public class Guru99ClassObjectCreation { public static void main (String[] args) throws ClassNotFoundException { //1 - 用 Class.forName() 方法 Class c1 = Class.forName("Guru99ClassObjectCreation"); //2- 用 getClass() 方法 Guru99ClassObjectCreation guru99Obj = new Guru99ClassObjectCreation(); Class c2 = guru99Obj.getClass(); //3- 用 .class Class c3= Guru99ClassObjectCreation.class; } } 

以下示例展示创建 "class" 类对象的不同方式:

示例 1:获取类元数据

演示获取类名、父类名、实现接口、访问修饰符等元数据。

目标类 Guru99Base.class:

精通 Java 反射 API:实战指南与代码示例

import java.io.Serializable; public abstract class Guru99Base implements Serializable,Cloneable { } 
  1. 类名:Guru99Base
  2. 访问修饰符:public 和 abstract
  3. 实现接口:Serializable 和 Cloneable
  4. 未显式继承类,父类为:java.lang.Object

下面类获取 Guru99Base.class 元数据并打印:

精通 Java 反射 API:实战指南与代码示例

import java.lang.reflect.Modifier; public class Guru99GetclassMetaData { public static void main (String [] args) throws ClassNotFoundException { // 创建 Guru99Base.class 的 Class 对象 Class guru99ClassObj = Guru99Base.class; // 打印类名 system.out.println("Name of the class is : " +guru99ClassObj.getName()); // 打印父类名 system.out.println("Name of the super class is : " +guru99ClassObj.getSuperclass().getName()); // 用 getInterfaces() 以 Class 数组获取实现接口列表 class[] guru99InterfaceList = guru99classObj.getInterfaces(); // 用 foreach 循环打印实现接口 system.out.print("Implemented interfaces are : "); for (Class guru99class1 : quru99 InterfaceList) { system.out.print guru99class1.getName() + " "); } system.out.println(); // 用 getModifiers() 和 Modifier.toString() 获取访问修饰符 int guru99AccessModifier= guru99classObj.getModifiers(); // 打印访问修饰符 System.Out.println("Access modifiers of the class are : " +Modifier.tostring(guru99AccessModifier)); } } 
  1. 用 getName 打印类名
  2. 用 getSuperClass().getName() 打印父类名
  3. 打印实现接口名
  4. 打印类使用的访问修饰符

精通 Java 反射 API:实战指南与代码示例

精通 Java 反射 API:实战指南与代码示例

示例 2:获取变量元数据

演示获取变量元数据。

创建含变量的类 Guru99VariableMetaData.class:

package guru; public class Guru99VariableMetaData { public static int guru99IntVar1=1111; static int guru99IntVar2=2222; static String guru99StringVar1="guru99.com"; static String guru99StringVar2="Learning Reflection API"; } 

获取上述类变量元数据步骤:

  1. 创建上述类对象即 Guru99VariableMetaData.class:
     Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass();
  2. 用 getFields() 或 getDeclaredFields() 以 Field 数组获取元数据:
    Field[] guru99Field1= guru99ClassObjVar .getFields(); Field[] guru99Fiel2= guru99ClassObjVar .getDeclaredFields();

getFields() 返回指定类及其父类的 public 变量元数据。

getDeclaredFields() 返回仅指定类的所有变量元数据。

  1. 用 "public String getName()" 获取变量名。
  2. 用 "public Class getType()" 获取变量数据类型。
  3. 用 "public xxx get (Field)" 获取变量值。

    xxx 为要获取值的类型(byte、short 等)。

  4. 用 getModifier() 和 Modifier.toString(int i) 获取变量访问修饰符。

    下面类获取 Guru99VariableMetaData.class 变量元数据:

    精通 Java 反射 API:实战指南与代码示例

    package guru; import java.lang.reflect.Field; public class Guru99VariableMetaDataTest { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // 创建 Guru99VariableMetaData.class 类对象 Guru99VariableMetaData guru99ClassVar = new Guru99VariableMetaData(); Class guru99ClassObjVar = guru99ClassVar.getClass(); // 获取 Guru99VariableMetaData 类所有字段元数据 Field[] guru99Field1= guru99ClassObjVar.getDeclaredFields(); // 打印指定类变量名、数据类型、访问修饰符、值 for(Field field : guru99Field1) { System.out.println("Variable name : "+field.getName()); System.out.println("Datatypes of the variable :"+field.getType()); int guru99AccessModifiers = field.getModifiers(); System.out.printlln("Access Modifiers of the variable : "+Modifier.toString(guru99AccessModifiers)); System.out.println("Value of the variable : "+field.get(guru99ClassVar)); System.out.println(); system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *") ; } } } 
    1. 创建 Guru99VariableMetaData.class 类对象
    2. 以 Field 数组获取所有变量元数据
    3. 打印 Guru99VariableMetaData.class 所有变量名
    4. 打印 Guru99VariableMetaData.class 所有变量数据类型
    5. 打印 Guru99VariableMetaData.class 所有变量访问修饰符
    6. 打印 Guru99VariableMetaData.class 所有变量值

    精通 Java 反射 API:实战指南与代码示例精通 Java 反射 API:实战指南与代码示例

    示例 3:获取方法元数据

    演示获取方法元数据。

    创建含方法的类 Guru99MethodMetaData.class:

    精通 Java 反射 API:实战指南与代码示例

    package guru; import java.sql.SQLException; public class Guru99MethodMetaData { public void guru99Add(int firstElement, int secondElement , String result) throws ClassNotFoundException, ClassCastException{ System.out.println("Demo method for Reflextion API"); } public String guru99Search(String searchString) throws ArithmeticException, InterruptedException{ System.out.println("Demo method for Reflection API"); return null; } public void guru99Delete(String deleteString) throws SQLException{ System.out.println("Demo method for Reflection API"); } }

    获取上述类方法元数据步骤:

    1. 创建类对象:
      Guru99MethodMetaData guru99ClassVar = new Guru99MethodMetaData (); Class guru99ClassObjVar = guru99ClassVar.getClass();
    2. 用 getMethods() 和 getDeclaredMethods() 以 Method 数组获取方法信息:
      Method[] guru99 Method 1= guru99ClassObjVar .get Methods(); Method [] guru99 Method 2= guru99ClassObjVar .getDeclared Method s();

      getMethods() 返回指定类及其父类的 public 方法元数据。

      getDeclaredMethods() 返回仅指定类的所有方法元数据。

    3. 用 getName() 获取方法名。
    4. 用 getReturnType() 获取返回类型。
    5. 用 getModifiers() 和 Modifiers.toString(int i) 获取访问修饰符。
    6. 用 getParameterTypes() 获取参数类型(返回 Class 数组)。
    7. 用 getExceptionTypes() 获取抛出异常(返回 Class 数组)。

    下面类获取 Guru99MethodMetaData.class 方法元数据:

    精通 Java 反射 API:实战指南与代码示例

    package guru; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class Guru99MethodMetaDataTest { public static void main (String[] args) { // 创建 Guru99MethodMetaData.class 类对象 class guru99ClassObj = Guru99MethodMetaData.class; // 用 getDeclaredMethods() 获取类所有方法元数据 Method[] guru99Methods=guru99classObj.getDeclaredMethods(); for(Method method : guru99Methods) { // 打印方法名 System.out.println("Name of the method : "+method.getName()); // 打印返回类型 System.out.println("Return type of the method : "+method.getReturnType()); // 获取并打印访问修饰符 int guru99ModifierList = method.getModifiers(); System.Out.printlin ("Method access modifiers : "+Modifier.toString(guru99ModifierList)); // 获取并打印参数类型 Class[] guru99ParamList= method.getParameterTypes(); system.out.print ("Method parameter types : "); for (Class class1 : guru99ParamList){ System.out.println(class1.getName()+" "); } System.out.println(); // 获取并打印方法抛出异常 Class[] guru99ExceptionList = method. getExceptionTypes(); system.out.print("Excpetion thrown by method :"); for (Class class1 : guru99ExceptionList) { System.out.println (class1.getName() +" "): } System.Out.println(); system.out.println("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "); } } } 
    1. 创建 Guru99MethodMetaData.class 类对象
    2. 以 Method 数组获取所有方法元数据
    3. 打印 Guru99MethodMetaData.class 所有方法名
    4. 打印 Guru99MethodMetaData.class 所有方法返回类型
    5. 打印 Guru99MethodMetaData.class 所有方法访问修饰符
    6. 打印 Guru99MethodMetaData.class 所有方法参数类型
    7. 打印 Guru99MethodMetaData.class 所有方法抛出异常

    精通 Java 反射 API:实战指南与代码示例

    精通 Java 反射 API:实战指南与代码示例

    示例 4:获取构造器元数据

    演示获取构造器元数据。

    创建含不同构造器的类 Guru99Constructor.class:

    精通 Java 反射 API:实战指南与代码示例

    package guru; import java.rmi.RemoteException; import java.sql.SQLException; public class Guru99Constructor { public Guru99Constructor(int no) throws ClassCastException ,ArithmeticException{ } public Guru99Constructor(int no, String name) throws RemoteException ,SQLException{ } public Guru99Constructor(int no, String name, String address) throws InterruptedException{ } }

    下面类获取 Guru99Constructor.class 构造器元数据:

    精通 Java 反射 API:实战指南与代码示例

    package guru; import java.lang.reflect.Constructor; public class Guru99ConstructorMetaDataTest { public static void main (String[] args) { // 创建 Guru99Constructor.class 类对象 Class guru99Class=Guru99Constructor.class; // 以 Constructor 数组获取所有构造器信息 Constructor[] guru99ConstructorList = guru99Class.getConstructors(); for (Constructor constructor : guru99ConstructorList) { // 打印每个构造器名 System.out.println("Constrcutor name : "+constructor.getName()); // 获取并打印访问修饰符 int guru99Modifiers= constructor.getModifiers(); System.Out.printlin ("Constrctor modifier : "+Modifier.toString(guru99Modifiers)); // 获取并打印参数类型 Class[] guru99ParamList=constructor.getParameterTypes(); System.out.print ("Constrctor parameter types :"); for (Class class1 : guru99ParamList) { System.out.println(class1.getName() +" "); } System. out.println(); // 获取并打印构造器抛出异常 Class[] guru99ExceptionList=constructor.getFxceptionTypes(); System.out.println("Exception thrown by constructors :"); for (Class class1 : guru99ExceptionList) { System.out.println(class1.getName() +" "); } System.out.println(); System.out.println("*******************************************"); } } } 
    1. 创建 Guru99Constructor.class 类对象
    2. 以 Constructor 数组获取所有构造器元数据
    3. 打印 Guru99Constructor.class 所有构造器名
    4. 打印 Guru99Constructor.class 所有构造器访问修饰符
    5. 打印 Guru99Constructor.class 所有构造器参数类型
    6. 打印 Guru99Constructor.class 所有构造器抛出异常

    精通 Java 反射 API:实战指南与代码示例

    精通 Java 反射 API:实战指南与代码示例

    总结:

    • Java 反射编程助于检索和修改类及类成员(变量、方法、构造器)信息。
    • 反射 API 通过 java.lang.reflect 包类和 java.lang.Class 类方法实现。
    • java.lang.Class 常用方法:getName()、getSuperclass()、getInterfaces()、getModifiers() 等。
    • java.lang.reflect 常用类:Field、Method、Constructor、Modifier 等。
    • 反射 API 可访问类私有方法和变量,可能构成安全威胁。
    • 反射 API 是 Java 提供的强大能力,但伴随性能开销、安全漏洞、权限问题,应作为最后手段使用。

java

  1. C++ 类与对象实战指南:封装、构造函数、析构函数与访问控制
  2. C# 类与对象实战教程:从定义到实例化的完整指南
  3. C# 抽象类实战教程:从定义到派生的完整代码示例
  4. C# 接口详解:定义、示例与实战应用
  5. 精通 Java 匿名内部类:定义、语法与实战示例
  6. 精通 Java 反射:运行时检查类、方法与字段
  7. 掌握 Java ObjectInputStream:反序列化对象完全指南
  8. 掌握 Java ObjectOutputStream:序列化、核心方法与实战示例
  9. Java String.charAt() 详解:语法、返回类型、异常与实战示例
  10. 精通 Java String.endsWith():检查字符串后缀(示例)
  11. Java BufferedReader 读取文件:实战指南与示例
  12. Java 插入排序算法详解:核心原理、完整代码与步骤演示