Java反射 - 方法 Methods

简介: 使用Java反射,您可以检查类的方法并在运行时调用它们。 这是通过Java类java.lang.reflect.Method完成的。 本文将更详细地介绍Java方法对象。

使用Java反射,您可以检查类的方法并在运行时调用它们。 这是通过Java类java.lang.reflect.Method完成的。 本文将更详细地介绍Java方法对象。

获取方法对象

Method类是从Class对象中获得的。 这里是一个例子:

Class aClass = ...//obtain class object
Method[] methods = aClass.getMethods();

Method []数组对于在该类中声明的每个公用方法都将有一个Method实例。

如果您知道要访问的方法的确切参数类型,则可以这样做,而不是获取数组的所有方法。 这个例子返回一个名为“doSomething”的公共方法,该方法以String为参数:

Class  aClass = ...//obtain class object
Method method =
    aClass.getMethod("doSomething", new Class[]{String.class});

如果没有方法匹配给定的方法名称和参数,在这种情况下String.class,抛出一个NoSuchMethodException。

如果您尝试访问的方法不带参数,请将null作为参数类型数组,如下所示:

Class  aClass = ...//obtain class object
Method method =
    aClass.getMethod("doSomething", null);

方法参数和返回类型

你可以阅读一个给定的方法是这样的参数:

Method method = ... // obtain method - see above
Class[] parameterTypes = method.getParameterTypes();

你可以像这样访问一个方法的返回类型:

Method method = ... // obtain method - see above
Class returnType = method.getReturnType();

使用方法对象调用方法 invoke

你可以调用像这样的方法:

//get method that takes a String as argument
Method method = MyObject.class.getMethod("doSomething", String.class);

Object returnValue = method.invoke(null, "parameter-value1");

null参数是要调用该方法的对象。 如果方法是静态的,则提供null而不是对象实例。 在这个例子中,如果doSomething(String.class)不是静态的,则需要提供一个有效的MyObject实例而不是null;

Method.invoke(Object target,Object ... parameters)方法接受可选数量的参数,但是您必须为要调用的方法中的每个参数提供一个参数。 在这种情况下,这是一个采取字符串的方法,所以必须提供一个字符串。

实战

package com.reflection.detail;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Fant.J.
 * 2018/2/7 15:04
 */
public class Reflection_Methods {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        //获取所有的共有方法
        Class aClass = People.class;
        Method [] methods = aClass.getMethods();

        //获取知道方法名称和参数 的方法,   如果没有参数,则传入null
        Method method = aClass.getMethod("setName", String.class);
        Method method1 = aClass.getMethod("getName",null);

        //根据method获取参数类型
        method.getParameterTypes();
        //根据method获取返回值类型
        method.getReturnType();

        /**
         *  使用反射来调用方法。如果方法是静态方法,则不需要实例该对象。
         *  因为我这里这个方法不是静态的。所以我实例化People对象
         *  仔细看看method和method1 是啥。代表了啥
         */
        People people = new People();
            method.invoke(people,"Fant.J");
            Object obj = method1.invoke(people,null);
            System.out.println(obj);
    }
}

结果

Fant.J

项目代码:github链接

相关文章
|
2月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
4天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
2天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
31 12
|
3天前
|
算法 Java API
Java 方法注释:规范、实用和高质量的写法
本文深入探讨了如何编写高质量的 Java 方法注释
25 11
|
3天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
21 5
|
27天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
2月前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
60 4
|
2月前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
88 4
|
2月前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
32 1
|
2月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。