java反射常用方法案例详解

Java 反射常用方法案例详解

什么是 Java 反射

Java 反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,并可动态修改它的属性。

在 Java 中,提供了一个类“java.lang.Class”来支持反射机制。在使用反射机制时,主要使用的就是这个类。

反射常用方法

获取Class类对象的方法

// 方法一:通过实例对象获取
Object obj = new Object();
Class clazz1 = obj.getClass();

// 方法二:通过类名获取
Class clazz2 = Object.class;

// 方法三:通过类全限定名获取
Class clazz3 = Class.forName("java.lang.Object");

获取类的构造方法

// 获取所有构造方法,包括私有构造方法
Constructor[] constructors = clazz.getConstructors();
Constructor[] constructors = clazz.getDeclaredConstructors();

// 获取指定参数类型的构造方法
Constructor constructor = clazz.getConstructor(String.class, int.class);
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);

获取类的字段

// 获取所有公共字段,包括从父类继承的字段
Field[] fields = clazz.getFields();

// 获取该类声明的所有字段,包括私有字段
Field[] fields = clazz.getDeclaredFields();

// 获取指定字段值
Field field = clazz.getField("fieldName");
Object fieldValue = field.get(objectInstance);
field.set(objectInstance, value);

获取类的方法

// 获取指定名称的方法,methodArgs为方法参数
Method method = clazz.getMethod("methodName", methodArgs);

// 获取所有公共方法,包括从父类继承的方法
Method[] methods = clazz.getMethods();

// 获取该类声明的所有方法,包括私有方法
Method[] methods = clazz.getDeclaredMethods();

// 调用方法,objectInstance为实例对象,args为方法参数
Object result = method.invoke(objectInstance, args);

示例

示例1:通过反射调用 private 方法

import java.lang.reflect.Method;

public class PrivateMethodDemo {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = PrivateMethodClass.class;
        Method method = clazz.getDeclaredMethod("privateMethod");

        // 禁止访问私有方法的执行权限检查,否则会报 IllegalAccessException 异常
        method.setAccessible(true);

        method.invoke(clazz.newInstance());
    }
}

class PrivateMethodClass {
    private void privateMethod() {
        System.out.println("This is a private method.");
    }
}

执行结果:

This is a private method.

示例2:通过反射修改 final 字段

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class FinalFieldDemo {
    public static void main(String[] args) throws Exception {
        Student student = new Student("Tom", 18);

        Class<?> clazz = student.getClass();
        Field fieldAge = clazz.getDeclaredField("age");

        // 禁止访问私有字段的访问权限检查,否则会报 IllegalAccessException 异常
        fieldAge.setAccessible(true);
        // 去除 final 修饰符
        Field fieldModifiers = Field.class.getDeclaredField("modifiers");
        fieldModifiers.setAccessible(true);
        fieldModifiers.setInt(fieldAge, fieldAge.getModifiers() & ~Modifier.FINAL); 
        fieldAge.setInt(student, 20);

        System.out.println(student);
    }
}

class Student {
    private String name;

    private final int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

执行结果:

Student{name='Tom', age=20}

总结

本篇文章向大家介绍了 Java 反射常用方法,包括获取 Class 类对象的方法、获取类的构造方法、获取类的字段、获取类的方法。并通过两个示例展示了反射机制的实际应用场景。反射机制的应用可以使我们在运行时动态地获取和操作类的属性和方法,极大地提高代码的灵活性和可读性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java反射常用方法案例详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • java中hashmap容量的初始化实现

    Java中,HashMap是一种常见的哈希表数据结构,它可以在常数时间内完成元素的插入、查找和删除操作,因此在Java编程中被广泛使用。HashMap的内部实现是通过链表+数组实现的,每个元素被放到数组的某个位置上,如果当前位置的元素数量过多则会形成一个链表。 HashMap的初始化需要两个参数:初始容量(initialCapacity)和负载因子(load…

    other 2023年6月20日
    00
  • java实现文件上传到linux服务器中

    以下是关于“Java实现文件上传到Linux服务器中”的完整攻略,过程中包含两个示例。 背景 在Java开发中,有时需要将文件上传到Linux服务器中。本攻略将介绍如何使用Java实现文件上传到Linux服务器中。 基本原理 Java实现文件上传到Linux服务器的基本原理是通过SSH协议连接到Linux服务器,然后使用SCP命令将文件上传到服务器中。具体步…

    other 2023年5月9日
    00
  • 新手学习css优先级

    新手学习CSS优先级攻略 1. 了解CSS选择器的优先级 在学习CSS优先级之前,我们首先需要了解CSS选择器的优先级规则,因为CSS优先级直接受选择器的影响。CSS选择器按照以下规则进行排序: 内联样式(在HTML元素的style属性中定义的样式)具有最高的优先级; ID选择器具有较高优先级; 类选择器和属性选择器具有中等优先级; 元素选择器和伪类选择器具…

    other 2023年6月28日
    00
  • Java 获取本机IP地址的实例代码

    获取本机IP地址是Java编程中的一个常见需求。下面是一个完整的攻略,包含了两个示例说明。 步骤1:使用InetAddress类获取本机IP地址 Java提供了InetAddress类来获取本机的IP地址。以下是获取本机IP地址的示例代码: import java.net.InetAddress; import java.net.UnknownHostExc…

    other 2023年7月30日
    00
  • Win10右键菜单怎么添加Windows Defender扫描项目?

    添加Windows Defender扫描项目到Win10右键菜单的具体步骤如下: 打开注册表编辑器。按下Win+R打开运行窗口,输入“regedit”,按下回车键即可打开注册表编辑器。 找到以下路径:HKEY_CLASSES_ROOT\Directory\Background\shell 右键shell,选择新建项(New>Key),输入“Window…

    other 2023年6月27日
    00
  • Linux的文件描述符、文件指针、索引节点详情

    Linux的文件描述符、文件指针和索引节点都是文件系统中非常重要的概念。在本文中,我们将深入了解它们,并提供一些示例来帮助您更好地理解它们。 文件描述符 在Linux中,文件描述符是整数的标识符,用于访问文件、套接字和其他I/O资源。文件描述符由内核提供,每次调用open()或socket()时返回一个唯一的文件描述符。在C语言中,可以使用int类型的变量来…

    other 2023年6月27日
    00
  • 小米AI通话如何自定义内容?小米AI通话自定义内容教程

    小米AI通话自定义内容攻略 小米AI通话是一款基于语音识别、自然语言处理等人工智能技术的智能语音助手。通过自定义小米AI通话内容,可以让小米AI通话更好地适配不同的场景和任务,提高用户的交互体验。下面详细讲解小米AI通话如何自定义内容和对应的教程。 1. 自定义小米AI通话技能 要自定义小米AI通话的内容,需要先了解小米AI通话技能的概念。小米AI通话技能是…

    other 2023年6月25日
    00
  • linuxrz的使用

    以下是关于“linuxrz的使用”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 linuxrz是Linux系统中的一个命令行工具,用于在本地计算机和远程计算机之间传输文件。它可以通过SSH协议进行加密传输,保证数据的安全性。 步骤 是使用linuxrz进行文件传输的步骤: 安装linuxrz:使用以下命令在Linux系统中安装linuxrz。 bas…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部