首页 > 编程语言 >揭秘Java反射的神秘面纱:Method.invoke方法,让你的代码更灵活!

揭秘Java反射的神秘面纱:Method.invoke方法,让你的代码更灵活!

时间:2024-11-28 16:59:09浏览次数:7  
标签:调用 Java name invoke Class Person sayHello 方法 Method

Java反射机制允许程序在运行时动态地访问和操作类的属性和方法。Method类的invoke方法是反射API中一个非常强大的工具,它可以用来调用任何对象的任意方法,包括私有方法。

基本用法

Method.invoke(Object obj, Object... args) 方法用于调用对象 obj 上的方法。其中,args 是传递给方法的参数列表。如果被调用的方法没有参数,则传递一个空数组或null。

示例代码

假设我们有一个简单的类 Person,其中包含一个私有方法 sayHello

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    private void sayHello() {
        System.out.println("Hello, my name is " + name);
    }
}

现在,我们想要使用反射来调用 sayHello 方法:

import java.lang.reflect.Method;

public class ReflectionTest {
    public static void main(String[] args) {
        try {
            // 创建Person对象
            Person person = new Person("John");

            // 获取Person类的Class对象
            Class<?> clazz = person.getClass();

            // 获取sayHello方法,注意因为是私有方法,所以需要设置可访问性为true
            Method method = clazz.getDeclaredMethod("sayHello");
            method.setAccessible(true); // 使得私有方法可以被访问

            // 调用sayHello方法
            method.invoke(person);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

详解

  1. 获取Class对象:首先,我们需要获取到Person类的Class对象。这可以通过调用getClass()方法实现,也可以通过Class.forName("完整类名")来实现。

  2. 获取Method对象:通过Class对象的getDeclaredMethod(String name, Class<?>... parameterTypes)方法可以获取到特定的方法。这里我们传入了方法名"sayHello"。由于sayHello是一个私有方法,所以我们还需要调用setAccessible(true)来确保我们可以访问它。

  3. 调用方法:最后,我们使用Method.invoke(Object obj, Object... args)来调用方法。第一个参数是要在其上调用方法的对象实例,第二个参数是传递给方法的参数列表。因为sayHello没有参数,所以我们传递了一个空数组。

注意事项

  • 当使用反射调用方法时,可能会抛出多种异常,如NoSuchMethodExceptionIllegalAccessExceptionInvocationTargetException等。因此,调用invoke方法时通常需要处理这些异常。
  • 使用反射会略微降低性能,因为它绕过了常规的编译时类型检查。此外,过度使用反射可能会使代码难以理解和维护。

标签:调用,Java,name,invoke,Class,Person,sayHello,方法,Method
From: https://blog.csdn.net/Q2024107/article/details/144088731

相关文章

  • 【Java 操作共享文件夹,SmbFile类让你轻松实现!】
    在Java中,通过使用SmbFile类可以方便地操作共享文件夹。SmbFile是JCIFS(JavaCIFSClientLibrary)库的一部分,用于访问基于SMB/CIFS协议的共享文件和打印机。以下是如何使用SmbFile类来操作共享文件夹的详细步骤和代码示例:1.添加JCIFS依赖首先,你需要在你的项目中添加JCI......
  • JAVA之多线程
    什么是线程?线程(Thread)是一个程序内部的一条执行流程。什么是多线程?多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)如何创建多线程:有两种方法可以创建新的执行线程。一种是将类声明为Thread的子类。此子类应覆盖类Thread的run方法。然后可......
  • 深入理解 Java 虚拟机-第一部分 走进 Java 笔记
    Sun/Oracle公司研发的热门虚拟机有三个:ClassicVM/ExactVM/HotSpotVMClassicVM:基于句柄(Handle)的对象查找方式,需要外挂JITExactVM:优于ClassicVM,使用了准确式内存管理(记录内存中存储的类型是地址还是数值),丢弃句柄,内置JIT,支持热点代码探测(通过计数器找出有......
  • java实现多线程读,单线程写
    多线程读,单线程写excel通过工厂模式,队列实现多线程读取(可以是文件,也可以是数据库),单线程向excel文件写;实现了一个线程出现问题其他线程同步中断。该实现逻辑的同时可以防止oom。  privatestaticfinalintINITIAL_CAPACITY=10;  privatestaticfinalintMAX_CA......
  • java 多线程同步方法CyclicBarrier/CountDownLatch/AtomicBoolean/Semaphore
    CyclicBarrier 有两个构造函数,CyclicBarrier(int),CyclicBarrier(int,Runnable)目的:通过输入任务数实现线程同步; 使用场景: 多线程计算:当多个线程需要分阶段并行处理数据,但在每一阶段结束时需要所有线程同步,以便开始下一阶段的处理。 并行任务协调:例如,在并行搜索或并行数......
  • JavaScript中的匿名函数
    JavaScript中的匿名函数是一种没有名称的函数,它们通常用于需要函数对象而不需要引用函数的场合。匿名函数可以在声明时立即调用,也可以作为参数传递给其他函数,或者赋值给变量。如何使用匿名函数1、立即执行函数表达式(IIFE):立即执行函数表达式是一种常见的匿名函数使用方式,它在定......
  • Q:CRON表达式,Linux和Java的不同写法
    CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表。调度精度:Linux的cron调度精度为分钟级别,最小粒度为分钟,而Java中的Quartz框架可以支持秒级别的调用。灵活性:Quartz框架提供了丰富的调度功能,可以支持一些复......
  • 多线程判断redis key导致Java hep space内存溢出
     线上经常发现报如下错误,后来发现rootcause是selectConfigitemforinstanceMap这个方法会查出几十万的结果集然后json压缩解压,写map等等操作,但是这个selectConfigitemforinstanceMap方法被很多地方调用到了,导致极有可能多线程同时都在查出几十万的结果集然后json压缩解压,写map等......
  • Javascript中的==与===
    在JavaScript中,==和===运算符用于比较两个值。==运算符被称为相等运算符(EqualityOperator)。它会比较两个值是否相等,但在比较之前会进行类型转换(如果两个值的类型不同)。如果两个值在类型转换后相等,则返回true。===运算符被称为严格相等运算符(StrictEqualityOperator)。它......
  • 前端技术对JavaScript的事件学习
    事件目录事件EventTarge接口事件模型Event对象事件类型EventTarge接口基本概念作用:EventTarget接口使得DOM元素和其他对象能够处理事件。通过该接口,可以绑定事件的监听函数,移除监听函数,以及触发事件。应用范围:不仅限于DOM节点,还包括一些需要事件通信的浏览器内置对象,如XMLH......