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中 Jackson 日期的时区和日期格式问题解决

    下面是关于“SpringBoot中 Jackson 日期的时区和日期格式问题解决”的完整攻略。 问题描述 在SpringBoot的开发中,我们经常需要将Java对象转换为JSON格式的数据,而这种转换一般都是使用Jackson框架完成的。但是在转换日期类型的时候,会出现时区和日期格式的问题,比如: 默认情况下,Jackson框架将日期转换为UTC时区的ISO…

    Java 2023年5月20日
    00
  • Java开发SpringBoot集成接口文档实现示例

    Java开发SpringBoot集成接口文档实现示例 在Java开发中,Spring Boot是一个非常流行的框架,它可以帮助我们快速搭建Web应用程序。同时,接口文档也是一个非常重要的工具,它可以帮助我们更好地理解和使用API。本文将介绍如何使用Spring Boot集成接口文档,并提供两个示例。 1. 添加Swagger依赖 Swagger是一个流行的接…

    Java 2023年5月14日
    00
  • 在idea中显示springboot面板的方法

    在IDEA中,我们可以使用Spring Boot面板来管理Spring Boot应用程序。本文将详细讲解在IDEA中显示Spring Boot面板的方法的完整攻略,并提供两个示例。 1. 配置Spring Boot插件 以下是配置Spring Boot插件的基本流程: 打开IDEA,点击File -> Settings -> Plugins。 在…

    Java 2023年5月15日
    00
  • MyBatis一次执行多条SQL语句的操作

    MyBatis是一款优秀的持久化框架,通过映射文件将SQL语句和Java方法进行映射,使得Java应用程序可以方便地访问数据库,提高数据库操作的效率和安全性。在实际应用中,有时需要执行多条SQL语句的操作,本文将详细讲解MyBatis一次执行多条SQL语句的操作的完整攻略。 1. 如何执行多条SQL语句的操作 在MyBatis中,通过使用<script…

    Java 2023年5月26日
    00
  • 浅谈RxJava处理业务异常的几种方式

    浅谈RxJava处理业务异常的几种方式 在RxJava中,对于发生的业务异常,我们需要合理地处理它们。本文将为你详细讲解RxJava处理业务异常的几种方式。 方式一:使用onErrorReturn onErrorReturn操作符可以自定义需要返回的异常。当遇到一个发生了异常的Observable时,它会立即将预先定义好的值或者引用返回给订阅者。 下面是一个…

    Java 2023年5月27日
    00
  • MIME Base64编码

    Base64是一种用于将二进制数据编码成可打印ASCII字符的编码方式。它由64个字符组成,包括A-Z、a-z、0-9以及+和/。它的编码规则非常简单:将3个字节的二进制数据(共24位)分成4组,每组6位,然后将这4组6位的值转换成一个可打印ASCII字符。 MIME Base64是Base64的一种变体,它是Multipurpose Internet Ma…

    Java 2023年4月25日
    00
  • MyBatis @Select注解介绍:基本用法与动态SQL拼写方式

    下面我来详细讲解”MyBatis @Select注解介绍:基本用法与动态SQL拼写方式”。 什么是@Select注解? @Select注解是MyBatis框架中用于查询的注解之一,用于执行查询操作的SQL语句。在使用MyBatis进行数据库操作时,我们可以使用@Select注解来替代在XML文件中编写SQL语句的方式,这样可以使得代码更加简洁和清晰。 @Se…

    Java 2023年5月20日
    00
  • Springboot项目中内嵌sqlite数据库的配置流程

    首先,我们需要在pom.xml中引入sqlite-jdbc依赖。在dependencies标签中添加如下代码: <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version&gt…

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