java.lang.Class.getDeclaredMethod()方法详解

本文详细解析了java.lang.Class.getDeclaredMethod()方法的使用,该方法用于获取类中指定名称和参数类型的已声明方法,包括public、protected和private方法。通过实例展示了如何调用此方法并获取Method对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.Class.getDeclaredMethod()方法用法

注:方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方

描述
java.lang.Class.getDeclaredMethod()方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。

name 参数是一个字符串,指定所需的方法的简单名称,

parameterTypes 参数是一个数组的Class对象识别方法的形参类型,在声明的顺序

声明

public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException,SecurityException

参数
name -- 方法的名称
parameterTypes -- 参数数组


返回值
匹配指定名称和参数的类的方法,此方法返回的Method对象


异常
NoSuchMethodException -- 如果匹配方法未找到

NullPointerException -- 如果name 为 null.


SecurityException -- If a security manager, s, is present.


实例
如何使用java.lang.Class.getDeclaredMethod()方法

package com.app.ui;
 
import java.lang.reflect.*;
 
public class ClassDemo {
 
   public static void main(String[] args) {
    
     ClassDemo cls = new ClassDemo();
     Class c = cls.getClass();
 
     try {
        // parameter type is null
        Method m = c.getDeclaredMethod("show", null);
        System.out.println("method = " + m.toString()); 
    
        // method Integer
        Class[] cArg = new Class[1]
        cArg[0] = Integer.class;
        Method lMethod = c.getDeclaredMethod("showInteger", cArg);
        System.out.println("method = " + lMethod.toString());
 
     }catch(NoSuchMethodException e){
        System.out.println(e.toString());
     }
   }
 
 
   private Integer show() {
      return 1;
   }
    
   public void showInteger(Integer i) {
      this.i = i;
   }
   public int i = 78655;
}

 编译和运行程序,产生以下结果:

method = private java.lang.Integer ClassDemo.show()
method = public void ClassDemo.showInteger(java.lang.Integer)

注:

getDeclaredMethod() 获取的是类自身声明的所有方法,包含public、protected和private方法。

getMethod () 获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。

<think>好的,用户想了解如何使用Java反射中的getDeclaredMethod方法。首先,我需要回忆这个方法的作用,它用于获取类中声明的特定方法,包括私有方法,但不包括继承的方法。记得参数需要方法名和参数类型列表。 接下来,用户可能需要一个具体的示例,所以得准备一个简单的类,比如包含不同方法的ExampleClass。然后展示如何通过反射获取这些方法,尤其是带参数和私有方法的情况。 还要注意,getDeclaredMethod可能会抛出异常,比如NoSuchMethodException,所以需要处理异常或者抛出。另外,调用私有方法前必须设置setAccessible(true),否则会报IllegalAccessException。 用户可能对参数类型的传递不太清楚,需要说明如何用Class对象指定参数类型,比如String.class。同时,是否需要区分静态方法和实例方法?调用时如果是实例方法,需要传入对应的对象实例。 参考提供的引用资料,确认示例的正确性,比如引用[3]和[4]提到参数类型的使用,以及获取方法后的invoke调用。需要确保示例代码语法正确,比如正确使用getDeclaredMethod和invoke的参数。 最后,整理步骤:获取Class对象、调用getDeclaredMethod、处理访问权限、使用invoke执行方法。可能还需要比较getDeclaredMethod和getMethod的区别,帮助用户理解何时使用哪个方法。 相关问题部分,要考虑用户可能的后续疑问,比如异常处理、访问私有方法的问题、参数类型匹配等,生成相关的问题,帮助用户深入学习。</think>### 如何通过Java反射获取类的声明方法? 在Java反射中,`getDeclaredMethod()` 方法用于获取类中声明的**特定方法**(包括私有方法),但需指定方法名称和参数类型。以下是具体步骤及示例: --- #### 1. 获取类的Class对象 通过类名或对象实例获取`Class`对象: ```java Class<?> clazz = ExampleClass.class; // 直接通过类名获取 // 或 ExampleClass obj = new ExampleClass(); Class<?> clazz = obj.getClass(); // 通过对象实例获取 ``` --- #### 2. 使用getDeclaredMethod() 方法签名: `Method getDeclaredMethod(String name, Class<?>... parameterTypes)` - **name**:方法名称(区分大小写) - **parameterTypes**:方法的参数类型列表(按顺序传入) ##### 示例1:获取无参方法 ```java Method method = clazz.getDeclaredMethod("methodName"); ``` ##### 示例2:获取带参数的方法 ```java Method method = clazz.getDeclaredMethod("methodName", String.class, int.class); ``` ##### 示例3:获取私有方法 ```java Method privateMethod = clazz.getDeclaredMethod("privateMethod"); privateMethod.setAccessible(true); // 解除私有方法访问限制 ``` --- #### 3. 调用方法 通过`invoke()`执行获取到的方法: ```java Object result = method.invoke(obj, args); // obj为实例对象,args为参数值 ``` --- #### 完整示例代码 ```java import java.lang.reflect.Method; class ExampleClass { public void publicMethod() { System.out.println("Public method called"); } private void privateMethod(String msg) { System.out.println("Private method: " + msg); } } public class ReflectionDemo { public static void main(String[] args) throws Exception { // 获取Class对象 Class<?> clazz = ExampleClass.class; // 获取无参公共方法 Method publicMethod = clazz.getDeclaredMethod("publicMethod"); ExampleClass obj = new ExampleClass(); publicMethod.invoke(obj); // 输出: Public method called // 获取带参数的私有方法 Method privateMethod = clazz.getDeclaredMethod("privateMethod", String.class); privateMethod.setAccessible(true); // 解除私有访问限制 privateMethod.invoke(obj, "Hello"); // 输出: Private method: Hello } } ``` --- #### 关键注意事项 1. **方法存在性**:若方法不存在,会抛出`NoSuchMethodException`[^3]。 2. **参数类型匹配**:参数类型必须与声明完全一致(例如`int.class`不能替代`Integer.class`)[^4]。 3. **访问权限**:私有方法需调用`setAccessible(true)`才能调用[^2]。 4. **静态方法**:若方法是静态的,`invoke()`第一个参数应设为`null`。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值