java反射常用方法案例详解

yizhihongxing

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聊天室之实现客户端一对一聊天功能

    实现Java聊天室中的一对一聊天功能,需要涉及到客户端和服务器端的编写。 1. 设计思路 客户端与服务器端之间需要建立起TCP连接,首先需要在客户端上实现一个发送和接收消息的模块,与此同时,需要在服务器端上能够接收到客户端发送的消息,再将其转发给目标用户。 设计思路如下: 客户端输入目标用户的用户名 通过TCP连接,向服务器端发送一条消息,告知服务器需要与目…

    other 2023年6月25日
    00
  • Java动态脚本Groovy获取Bean技巧

    Java动态脚本Groovy获取Bean技巧 在Java中使用Groovy可以轻松地使用动态脚本获取Bean。这里介绍一些Java动态脚本Groovy获取Bean的技巧。 导入Groovy库 Groovy是一种基于JVM的动态脚本语言,所以它可以和Java代码一起运行。为了使用Groovy获取Bean,需要在Java项目中导入Groovy库。 示例代码 @G…

    other 2023年6月27日
    00
  • Linux Container(LXC容器)的基本命令使用简介

    以下是关于 Linux Container(LXC容器)的基本命令使用简介的攻略: 什么是 Linux Container(LXC容器)? Linux Container 是一种轻量级的虚拟化技术,它是在单个 Linux 内核上运行多个隔离的容器。每个容器都有自己的文件系统、进程空间、网络和资源配额,而且它们之间是互相隔离的。Linux Container …

    other 2023年6月26日
    00
  • ora-01722:无效数字的解决方法

    ORA-01722:无效数字的解决方法 在Oracle数据库中,我们有时会遇到错误代码ORA-01722,该错误消息通常会提示“无效数字”。这种错误可能会导致系统崩溃或数据丢失,因此我们需要了解它的原因和解决方法。 原因 此错误通常是由以下原因引起的: 数据类型不匹配:例如,您尝试将字符值插入整数列,或者将日期值插入字符串列中。 格式错误:您尝试将不正确格式…

    其他 2023年3月29日
    00
  • mybatis多层嵌套resultMap及返回自定义参数详解

    MyBatis多层嵌套ResultMap及返回自定义参数详解攻略 在使用MyBatis进行数据库操作时,有时候需要进行多表关联查询,并将结果映射到一个复杂的对象中。MyBatis提供了多层嵌套ResultMap的功能,可以方便地处理这种情况。同时,我们也可以返回自定义参数,以满足特定的业务需求。 1. 多层嵌套ResultMap 多层嵌套ResultMap允…

    other 2023年7月28日
    00
  • 跟老齐学Python之数据类型总结

    跟老齐学Python之数据类型总结 本文将对Python中常见的数据类型进行总结,包括数字、字符串、布尔值、列表、元组、集合、字典等。 数字 Python中常见的数字类型有整型(int)、浮点型(float)和复数(complex),都可以进行基本的算术运算。 示例1:计算圆的面积 r = 5 # 半径 pi = 3.14 area = pi * r ** …

    other 2023年6月27日
    00
  • C语言中不定参数 … 的语法以及函数封装

    C语言中的不定参数是指函数参数个数可以不固定,在参数类型、个数和顺序都不能确定时使用。在函数定义时,借助三个点(…)表示不定参数,而在调用时,需要在函数参数列表中列出实际传入的所有参数。 下面是三点要点: 函数定义时使用省略号(…)来表示参数数量不固定: int sum(int count, …) { int total = 0; va_list…

    other 2023年6月27日
    00
  • Mysql 聚合函数嵌套使用操作

    MySQL 聚合函数嵌套使用操作攻略 在MySQL中,聚合函数是用于对数据进行统计和计算的函数。聚合函数可以嵌套使用,即在一个聚合函数的参数中使用另一个聚合函数。这种嵌套使用可以帮助我们更灵活地进行数据分析和计算。下面是详细的攻略,包含两个示例说明。 1. 基本语法 聚合函数的基本语法如下: SELECT aggregate_function1(aggreg…

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