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日

相关文章

  • php递归创建目录的方法

    下面我来详细讲解一下在PHP中如何递归创建目录。 什么是递归创建目录 递归创建目录是指在创建目录时,如果该目录的上级目录不存在,就会先创建上级目录,然后再创建当前目录的过程,一直进行到最后一级目录。 PHP递归创建目录的方法 PHP中有一个内置的函数mkdir()可以用来创建目录,但是该函数只能一次性创建一个目录,无法递归创建。如果要递归创建目录,就需要写递…

    other 2023年6月27日
    00
  • 局域网共享常见问题解决汇集

    局域网共享常见问题解决汇集 在局域网中共享文件和打印机是很常见的需求。然而,在实际使用中我们可能会遇到各种问题,例如连接不上、速度慢、权限不足等等。本文将介绍几种常见的问题及其解决方法。 问题1:连接不上共享文件夹 症状 当尝试连接共享文件夹时,可能会弹出错误消息,显示无法连接到网络位置。这可能是由于网络连接问题或共享设置问题导致的。 解决方法 确保电脑已经…

    other 2023年6月27日
    00
  • 解析从小程序开发者工具源码看原理实现

    这里我将详细讲解解析从小程序开发者工具源码看原理实现的完整攻略。 前言 如今,小程序已经成为了移动互联网的一个重要组成部分,而小程序开发者工具则是小程序开发的必备工具。对于一个开发者而言,了解小程序开发者工具的原理实现,将有助于更好地了解小程序的开发和调试。 步骤 以下为从小程序开发者工具源码看原理实现的攻略步骤: 1. 下载开发者工具源码 可以从小程序官网…

    other 2023年6月26日
    00
  • 文件无法直接发送到蓝牙点击右键没有发送到蓝牙设备

    文件无法直接发送到蓝牙点击右键没有发送到蓝牙设备 如果我们将电脑上的文件发送到其他设备使用蓝牙时,我们通常会采用右键菜单中的“发送到”操作。但是,有时候当我们右击待发送的文件时,却发现“发送到”选项中没有“蓝牙设备”选项,也无法直接将文件发送到蓝牙设备上。对于这种情况,我们可以尝试以下方法来解决: 方法一:重新启动蓝牙服务并连接设备 首先,我们需要确认蓝牙服…

    other 2023年6月27日
    00
  • 关于spring中不同包中类名相同报错问题的总结

    在 Spring 中,不同的包中出现相同名称的类是很常见的事情。在项目开发过程中,经常会遇到类名相同但是出现在不同包中的情况。在这种情况下,会产生一些问题,例如编译器无法识别应该调用哪个类,如何解决呢? 以下是几个概述解决“关于spring中不同包中类名相同报错问题”的步骤: 使用全包名调用类名 使用 import 关键字指定特定的类 下面将分两个示例详细讲…

    other 2023年6月27日
    00
  • AD常用命令以及概念

    AD常用命令以及概念 AD(Active Directory)是微软推出的一种基于LDAP(Lightweight Directory Access Protocol)协议的目录服务,用于管理网络系统的用户、计算机、群组、权限等信息。在日常的系统管理工作中,掌握AD的基本知识和常用命令是非常有必要的。 概念介绍 域(Domain) AD中的域指的是逻辑上的一…

    其他 2023年3月28日
    00
  • arcgis10.3安装及破解

    ArcGIS 10.3安装及破解 ArcGIS是一个广泛使用的地理信息系统软件,目前最新版本为ArcGIS 10.8,但是旧版本的ArcGIS 10.3也被广泛应用。在本文中,将介绍ArcGIS 10.3的安装及破解方法。 第一部分:ArcGIS 10.3安装 首先,下载ArcGIS 10.3的安装程序。可以从官方网站或者其他可信赖的软件下载网站下载。下载完…

    其他 2023年3月29日
    00
  • dos/bat中获取用户输入内容的代码(保存到文件中)

    当我们需要从用户那里获取输入数据时,可以通过在 DOS/BAT 脚本中使用 set /p 命令来实现。set /p 命令的使用格式如下: set /p variable=prompt text 其中,variable 是用户输入数据后赋值的变量;prompt text 是提示用户输入的文本。 获取用户输入数据并保存到文件的方式,可以使用 echo 命令将 s…

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