Java反射之通过反射获取一个对象的方法信息(实例代码)

使用Java反射可以在运行时获取一个类的各种信息,包括类的属性、方法、构造器等。本文将介绍如何通过反射获取一个对象的方法信息,并提供两个示例进行说明。

获取对象的方法信息

要获取一个对象的方法信息,需要使用Java反射中的Method类。Method类提供了关于类或接口中单独某个方法的信息和访问权限。

使用反射获取对象的方法信息的步骤如下:

  1. 获取该类的Class对象。

java
Class<?> clazz = obj.getClass();

这里的obj是一个Object类型的对象,可以是任何一个Java对象。getClass()方法返回表示该对象所属类或接口的Class对象。

  1. 通过Class类的getDeclaredMethods()或getMethods()方法获取该类的全部或公共方法。

java
Method[] methods = clazz.getDeclaredMethods();
//或者
Method[] methods = clazz.getMethods();

getDeclaredMethods()方法返回该类中声明的全部方法,包括私有方法。getMethods()方法返回该类或其父类中的全部公共方法。这两个方法都返回一个Method数组。

  1. 遍历Method数组获取方法的信息。

java
for (Method method : methods) {
//获取该方法的访问修饰符
int modifiers = method.getModifiers();
String modifierStr = Modifier.toString(modifiers);
//获取方法名
String methodName = method.getName();
//获取方法的参数数量
int parameters = method.getParameterCount();
//获取方法的返回值类型
Class<?> returnType = method.getReturnType();
//输出方法信息
System.out.println(modifierStr + " " + returnType.getSimpleName() + " " + methodName + "(" + parameters + ")");
}

通过Method类提供的方法可以获取方法的访问修饰符、方法名、参数数量和返回值类型等信息。

示例

下面提供两个示例进行说明。

示例1

以String类为例,获取该类的全部方法信息。

public static void main(String[] args) {
    String str = "Hello, world!";
    Class<?> clazz = str.getClass();
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        int modifiers = method.getModifiers();
        String modifierStr = Modifier.toString(modifiers);
        String methodName = method.getName();
        int parameters = method.getParameterCount();
        Class<?> returnType = method.getReturnType();
        System.out.println(modifierStr + " " + returnType.getSimpleName() + " " + methodName + "(" + parameters + ")");
    }
}

输出结果:

public int length()
public int codePointCount(int,int)
public int codePointAt(int)
public int codePointBefore(int)
public int offsetByCodePoints(int,int)
public void getChars(int,int,char[],int)
public byte[] getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public byte[] getBytes()
public boolean contentEquals(java.lang.CharSequence)
public boolean contentEquals(java.lang.StringBuffer)
public boolean equalsIgnoreCase(java.lang.String)
public int compareTo(java.lang.Object)
public int compareTo(java.lang.String)
public int compareToIgnoreCase(java.lang.String)
public boolean regionMatches(int,java.lang.String,int,int)
public boolean regionMatches(boolean,int,java.lang.String,int,int)
public boolean startsWith(java.lang.String,int)
public boolean startsWith(java.lang.String)
public boolean endsWith(java.lang.String)
public int hashCode()
public int indexOf(int)
public int indexOf(int,int)
public int lastIndexOf(int)
public int lastIndexOf(int,int)
public int indexOf(java.lang.String)
public int indexOf(java.lang.String,int)
public int lastIndexOf(java.lang.String)
public int lastIndexOf(java.lang.String,int)
public java.lang.String substring(int)
public java.lang.String substring(int,int)
public java.lang.String concat(java.lang.String)
public java.lang.String replace(char,char)
public java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence)
public boolean matches(java.lang.String)
public boolean contains(java.lang.CharSequence)
public java.lang.String[] split(java.lang.String,int)
public java.lang.String[] split(java.lang.String)
public static java.lang.String join(java.lang.CharSequence,java.lang.CharSequence[])
public static java.lang.String join(java.lang.CharSequence,java.lang.Iterable)
public java.lang.String toLowerCase()
public java.lang.String toLowerCase(java.util.Locale)
public java.lang.String toUpperCase()
public java.lang.String toUpperCase(java.util.Locale)
public java.lang.String trim()
public char[] toCharArray()
public static java.lang.String format(java.lang.String,java.lang.Object[])
public static java.lang.String format(java.util.Locale,java.lang.String,java.lang.Object[])
public static java.lang.String valueOf(java.lang.Object)
public static java.lang.String valueOf(char[])
public static java.lang.String valueOf(char[],int,int)
public static java.lang.String valueOf(boolean)
public static java.lang.String valueOf(char)
public static java.lang.String valueOf(int)
public static java.lang.String valueOf(long)
public static java.lang.String valueOf(float)
public static java.lang.String valueOf(double)
public native java.lang.String toString()

示例2

自定义一个Person类,获取该类的公共方法信息。

public class Person {
    private String name;

    public Person() {}

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

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

    public void sayGoodbye() {
        System.out.println("Goodbye, " + name);
    }
}
public static void main(String[] args) {
    Person person = new Person("John");
    Class<?> clazz = person.getClass();
    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        int modifiers = method.getModifiers();
        String modifierStr = Modifier.toString(modifiers);
        String methodName = method.getName();
        int parameters = method.getParameterCount();
        Class<?> returnType = method.getReturnType();
        System.out.println(modifierStr + " " + returnType.getSimpleName() + " " + methodName + "(" + parameters + ")");
    }
}

输出结果:

public void sayHello()
public void sayGoodbye()
public final void wait(long) throws java.lang.InterruptedException
public final native void wait(long,int) throws java.lang.InterruptedException
public final void wait() throws java.lang.InterruptedException
public boolean equals(java.lang.Object)
public java.lang.String toString()
public native int hashCode()
public final native java.lang.Class getClass()
public final native void notify()
public final native void notifyAll()

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java反射之通过反射获取一个对象的方法信息(实例代码) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 使用springboot+druid双数据源动态配置操作

    下面是“使用SpringBoot+Druid双数据源动态配置操作”的完整攻略及两条示例。 一、概述 在实际的项目开发中,经常会遇到同时操作多个不同的数据库的情况,比如读写分离、多租户等。使用SpringBoot+Druid双数据源动态配置操作,可以有效地解决这些问题。 二、配置SpringBoot+Druid 1. 引入相关依赖 在 pom.xml 文件中加…

    Java 2023年5月20日
    00
  • java如何实现自动生成数据库设计文档

    实现Java自动生成数据库设计文档的过程可以分为以下几个步骤: 获取数据库的基本信息 首先需要连接到数据库,获取其中的基本信息,例如数据库的名称、版本号等。在Java中可以使用JDBC连接数据库,通过执行SQL语句获取这些信息。 获取数据库中的表信息 获取数据库中的表信息,包括表名、表的列信息等。可以通过执行SQL语句查询system表或metadata元数…

    Java 2023年5月19日
    00
  • 基于jsp+servlet实现的简单博客系统实例(附源码)

    这篇文章将会详细讲解如何通过使用JSP和Servlet来实现一个简单的博客系统。我们将会从搭建环境开始,到完成整个系统的构建。 环境搭建 工具准备 在开始之前,我们需要准备以下工具: Java SE Development Kit(JDK) Eclipse IDE for Java EE Developers Tomcat服务器 创建项目 打开Eclipse…

    Java 2023年6月15日
    00
  • 深入java事件注册的应用分析

    深入Java事件注册的应用分析 简述 Java事件注册是Java GUI编程中的一个重要方面。当用户与GUI界面进行交互时,Java事件注册机制能够自动触发相应的事件处理器。该机制为编写高效可靠、易于维护的Java程序提供了便利。 事件注册流程 Java事件注册的基本流程包括三个步骤: 根据需要创建事件源。 为事件源注册一个或多个事件监听器。 当事件源发生相…

    Java 2023年6月15日
    00
  • Struts2的配置文件方法小结

    一、概述 Struts2是一个基于MVC设计模式,用于Web应用程序开发的框架。它的配置非常重要,一个良好的配置可以提高应用程序的性能,降低开发成本。本文将对Struts2的配置方法进行小结。 二、Struts2的配置文件 在Struts2中,主要有以下几个配置文件: struts.xml 主要负责定义Action与我们的JSP页面之间实际的数据流动以及每一…

    Java 2023年5月20日
    00
  • springmvc中下载中文文件名称为下划线的解决方案

    下面是springmvc中下载中文文件名称为下划线的解决方案的基本步骤: 在Controller中获取文件 @GetMapping(“/download”) public ResponseEntity<ByteArrayResource> downloadFile(HttpServletRequest request) throws IOExce…

    Java 2023年5月20日
    00
  • Java实现通讯录管理系统项目

    下面我会给您详细讲解 Java 实现通讯录管理系统项目的完整攻略,步骤如下: 1. 确定所需技术栈 在开始之前,我们需要明确该项目需要用到哪些技术栈,Java 实现通讯录管理系统项目需要用到的技术栈包括: Java 语言基础 面向对象编程思想 Java 集合框架 文件 I/O 2. 设计通讯录管理系统的数据结构 在这一步骤中,我们需要通过数据结构来描述通讯录…

    Java 2023年5月24日
    00
  • struts2中simple主题下标签默认样式的移除方法

    在Struts2中,使用simple主题时,当表单校验出错后,错误信息会显示在标签中。如果默认的样式不符合我们的需求,我们需要对其进行自定义。以下是移除标签默认样式的完整攻略。 1. 引入CSS文件 在JSP中添加如下代码引入CSS文件: <head> <link rel="stylesheet" type="…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部