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日

相关文章

  • Nginx Tomcat负载均衡动静分离原理解析

    Nginx Tomcat负载均衡动静分离原理解析 Nginx是一个高性能的Web服务器和反向代理服务器,同时也可以作为负载均衡服务器使用。Tomcat是一个Java应用服务器,用于部署和运行Java Web应用程序。在高并发情况下,单一的应用服务器可能会出现瓶颈,无法满足大量请求,因此需要采用负载均衡技术来分摊请求压力。 在这种情况下,将Nginx作为负载均…

    Java 2023年6月15日
    00
  • 删除 Tomcat webapps 目录自带项目方式详解

    删除Tomcat webapps目录自带项目是一个常见的操作。下面通过以下步骤来详细地讲解该操作的完整攻略。 步骤一:停止 Tomcat 服务 在删除 Tomcat webapps 自带项目之前,首先需要停止 Tomcat 服务。可以使用以下命令来停止 Tomcat 服务: sudo systemctl stop tomcat 如果你使用的是旧版 Tomca…

    Java 2023年5月19日
    00
  • Sprint Boot @Controller使用方法详解

    @Controller是Spring Boot中的一个注解,它用于标记一个类为控制器类。在使用Spring Boot开发Web应用程序时,@Controller是非常有用的。本文将详细介绍@Controller的作用和使用方法,并提供两个示例说明。 @Controller的作用 @Controller的作用是标记一个类为控制器类。控制器类是指处理HTTP请求…

    Java 2023年5月5日
    00
  • java中的通用权限管理设计(推荐)

    Java中的通用权限管理设计(推荐) 简介 在Java应用程序开发过程中,通用权限管理设计可以有效地管理系统内不同用户的权限,做到安全可靠地管理用户访问数据的安全性和可靠性,避免了系统访问被恶意用户攻击,数据泄露和其他相关问题的出现。 设计 本文推荐一种常见的通用权限管理设计方案,使用RBAC(Role Based Access Control)模型,该模型…

    Java 2023年5月20日
    00
  • Java用正则表达式实现${name}形式的字符串模板实例

    那么让我们来详细讲解一下“Java用正则表达式实现${name}形式的字符串模板实例”的完整攻略。 第一步:定义模板字符串 首先,我们需要定义一个模板字符串,例如: String template = "Hello, ${name}! Welcome to our website."; 这个模板字符串中包含了一个占位符${name},我们…

    Java 2023年5月29日
    00
  • Java实现树形List与扁平List互转的示例代码

    以下是Java实现树形List与扁平List互转的完整攻略。 1. 概述 树形结构和扁平结构是常用的数据结构之一,在业务开发过程中常常需要互相转换。本攻略给出Java实现树形List与扁平List互转的示例代码。 2. 树形List转为扁平List 树形结构的定义: public class TreeNode { private String id; pri…

    Java 2023年5月26日
    00
  • Spring Security整合KeyCloak保护Rest API实现详解

    Spring Security整合KeyCloak保护Rest API实现详解 简介 本篇文章主要介绍如何使用Spring Security整合KeyCloak保护Rest API。 前置条件 在开始本文之前,你应该已经了解过以下知识: Spring Boot Spring Security Rest API设计基础 OAuth2.0和OpenID Conn…

    Java 2023年5月20日
    00
  • java实现Dijkstra最短路径算法

    下面是“java实现Dijkstra最短路径算法”的详细攻略: 什么是Dijkstra最短路径算法 Dijkstra最短路径算法是一种基于图的贪心算法,用于求解从一个出发点到其它节点的最短路径。算法适用于有向或无向加权图。 算法思路 初始化,将起点到各个节点的距离全部初始化为无穷大,将起点到自己的距离设置为0。 选取起点,将其设置为当前未处理节点中距离起点最…

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