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日

相关文章

  • Python详解如何动态给对象增加属性和方法

    Python详解如何动态给对象增加属性和方法 以下是使用Python动态给对象增加属性和方法的完整攻略: 1. 动态增加属性 可以使用点号(.)或setattr()函数来动态增加属性。 使用点号(.): class MyClass: pass obj = MyClass() obj.new_attr = \"Hello, World!\"…

    other 2023年10月15日
    00
  • html表格宽度固定

    HTML表格宽度固定 HTML表格在网页设计中扮演着非常重要的角色,但是表格太宽或太窄都可能影响到页面的美观和可读性,因此控制表格的宽度是一个必须要考虑的问题。本文将会介绍如何使用HTML和CSS来固定表格的宽度。 HTML 让表格自适应 在HTML中,表格的宽度默认是自适应的,也就是说表格的宽度会根据表格内容的多少自动调整。要指定表格的宽度,可以使用wid…

    其他 2023年3月28日
    00
  • JavaScript中进制之间的转换

    JavaScript 中进制之间的转换 在JavaScript的开发中,我们经常需要进行进制之间的转换,例如将一个十六进制数转化为整型数,或者将一个十进制数转化为二进制字符串。本文将介绍在JavaScript中如何进行进制之间的转换。 二进制转其他进制 二进制转十进制 将一个二进制数转化为十进制数,可以使用parseInt函数,具体实现如下: const b…

    其他 2023年3月28日
    00
  • ffmpeg——关于视频压缩

    ffmpeg——关于视频压缩 在在线视频服务越来越普及的今天,视频压缩已经成为了一个必须要掌握的技能。无论是为了减小视频文件大小以节省带宽,还是为了提高视频播放的流畅性,视频压缩都是不可或缺的一项操作。 而在视频压缩的领域里,FFmpeg 可谓是开源界的瑰宝,它是一套免费的、跨平台的、专业的视频音频处理工具。它支持多种格式的视频压缩和转换,并具有高效性、精确…

    其他 2023年3月28日
    00
  • python中子类与父类的关系基础知识点

    我们来详细讲解一下Python中子类和父类的关系基础知识点。 基础知识点 在面向对象编程中,子类是继承父类的属性和方法的。父类也被称为基类或超类,子类也被称为派生类或衍生类。子类可以继承父类的所有属性和方法,并且还可以添加新的属性和方法,或者覆盖/修改父类中的属性和方法。 要定义一个子类,需要使用关键字class,然后在类名后面加上父类的名称,用圆括号括起来…

    other 2023年6月26日
    00
  • Windows平台下搭建Git服务器的图文教程

    下面是详细讲解“Windows平台下搭建Git服务器的图文教程”的完整攻略。 1. 确认安装 Git 在开始搭建Git服务器之前,首先需要确认本地已经安装Git,可通过在命令行窗口中输入 git 命令检查是否已经安装。若未安装,可通过Git官网下载对应的安装程序进行安装。 2. 创建Git用户 搭建Git服务器需要创建一个Git用户,用于管理Git仓库。可通…

    other 2023年6月27日
    00
  • flutter插件汇总

    Flutter插件汇总攻略 Flutter插件是一种可以扩展Flutter框架功能的方式。Flutter插件可以提供许多功能,例如访问设备硬件、调用原生API等。在这份攻略中,我们将详细讲Flutter插件汇总的使用方法,包括如何查找、安装和使用Flutter插件等内容。 查找Flutter插件 在使用Flutter插之前,我们需要先查找需要的插件。Flut…

    other 2023年5月8日
    00
  • iOS 14.5/iPadOS 14.5开发者预览版 Beta 3更新详细介绍(附下载)

    iOS14.5/iPadOS 14.5 开发者预览版 Beta 3 更新详细介绍 iOS 14.5/iPadOS 14.5 开发者预览版 Beta 3 已经推出,这次更新加入了一些很有意思的功能和修复了一些 Bug。本篇文章将为你详细介绍这次更新的所有内容和下载链接。 新功能介绍 重新设计的远程应用程序支持:iOS 14.5/iPadOS 14.5 开发者预…

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