Java中Class的getDeclaredMethods和getMethods的区别

本文通过具体示例对比了Java反射中getMethods与getDeclaredMethods方法的区别。getMethods用于获取类及其父类的所有公共方法,而getDeclaredMethods仅获取当前类声明的所有方法,包括私有、保护及默认访问级别的方法。

在实际中经常需要使用反射机制获取类的属性和方法等信息.
Class中有两个方法可以获取类的方法:getDeclaredMethods和getMethods
下面实例说明这两个的区别

创建person类
class person{

    private float height;
    private float weight;

    void  getPersonName() {

    }
    public void  getPersonHeight() {

    }

    private void  getPersonWeight() {

    }

    protected void getPersonColor() {

    }
}
创建person类的子类
class student extends person {

    private String name;
    private int age;

    public student() {
        super();
    }
    void  getStudentHeight() {

    }    
    public void  getStudentName() {

    }   
    private void  getStudentAge() {

    }
    protected void getStudentColor() {

    }   
}
测试
public class reflect {

     public static void main(String[] args) {  

         try {
            Class classzz  = Class.forName("student");
            System.out.println("classzz = " + classzz);
            //getMethods方法
            Method[]  methods =  classzz.getMethods();
            System.out.println(" ----getMethods: ");
            for(Method m : methods) {
                System.out.println(m);
            }
            //getDeclaredMethods 方法
            Method[]  declaredMethods =  classzz.getDeclaredMethods();
            System.out.println("\r\n ----declaredMethods: ");
            for(Method m : declaredMethods) {
                System.out.println(m);
            }           
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }     
     }
}
输出
classzz = class student
 ----getMethods: 
public void student.getStudentName()
public void person.getPersonHeight()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

 ----declaredMethods: 
void student.getStudentHeight()
public void student.getStudentName()
private void student.getStudentAge()
protected void student.getStudentColor()
总结
  • 从以上测试结果可以看出,declaredMethods只能获取当前类的方法(包访问权限+public + private + protcted).
  • getMethods可以获取本身类和其**所有父类的所有共有方法(public)**.
<think>好的,用户想了解Java中反射的getMethod、getDeclaredMethodgetDeclaredMethods区别。我需要先回忆一下这三个方法的定义使用场景。 首先,反射是Java中强大的机制,允许程序在运行时检查操作类、方法、属性等。这三个方法都属于Class类的方法,用于获取类的方法信息。 getMethod方法,我记得是用来获取公共方法,包括继承的方法。可能需要参数类型来指定方法,比如有重载的情况。而getDeclaredMethod则是获取类自身声明的方法,包括私有、保护、默认公有,但不包括继承的方法。这一点容易混淆,需要特别注意。 然后是getDeclaredMethods,复数形式,应该是获取类自己声明的所有方法,不管访问权限,返回一个数组。而getMethods则是获取所有公共方法,包括继承的,但可能用户没问这个,但可以对比一下。 接下来需要整理它们的区别,从作用范围、访问权限、继承方法等方面来对比。例如,getMethod只能获取公共方法,包括父类的,而getDeclaredMethod只能获取当前类声明的任何访问权限的方法,不包括继承的。getDeclaredMethods则返回当前类所有声明的方法数组。 还要考虑使用场景,比如需要调用私有方法时,必须用getDeclaredMethod并设置setAccessible。而如果获取父类的方法,则用getMethod。 可能用户在实际使用中会遇到找不到方法的异常,比如NoSuchMethodException,这时候需要检查是否权限不足或者方法不存在,或者参数类型不匹配。 需要举例说明,比如一个类有public方法、private方法,父类的方法,如何用这三个方法获取。例如,Class.getMethod("publicMethod")可以获取,而getDeclaredMethod("privateMethod")可以获取,但getMethod("privateMethod")会抛出异常。 总结时,要分点明确区别,帮助用户快速理解。同时提醒安全性问题,反射可能破坏封装,需要谨慎使用。</think>Java反射中`getMethod`、`getDeclaredMethod``getDeclaredMethods`的区别主要体现在方法的作用范围访问权限控制上。以下是逐步对比分析: --- ### 1. **`getMethod(String name, Class<?>... parameterTypes)`** - **作用范围** 仅能获取当前类或父类中**公共(public)**的方法(包括继承的公共方法)。 - **访问权限** 只能访问`public`修饰的方法,无法获取私有、默认或受保护的方法。 - **示例** ```java // 获取父类或当前类的public方法 Method publicMethod = clazz.getMethod("methodName", parameterTypes); ``` - **常见异常** 若方法不存在或非`public`,抛出`NoSuchMethodException`。 --- ### 2. **`getDeclaredMethod(String name, Class<?>... parameterTypes)`** - **作用范围** 仅能获取当前类**自身声明**的方法(不包含继承的方法),但允许任何访问权限(`public`、`protected`、默认、`private`)。 - **访问权限** 可获取所有权限的方法,但需通过`setAccessible(true)`调用非`public`方法。 - **示例** ```java // 获取当前类声明的任意权限方法(包括private) Method privateMethod = clazz.getDeclaredMethod("methodName"); privateMethod.setAccessible(true); // 突破访问限制 ``` - **常见异常** 若方法不存在于当前类,抛出`NoSuchMethodException`。 --- ### 3. **`getDeclaredMethods()`** - **作用范围** 返回当前类**自身声明**的所有方法(不包含继承的方法),包括所有访问权限(`public`、`protected`、默认、`private`)。 - **返回值类型** `Method[]`数组,包含所有方法。 - **示例** ```java // 获取当前类所有声明的方法 Method[] methods = clazz.getDeclaredMethods(); ``` --- ### 对比总结 | 方法 | 作用范围 | 访问权限 | 是否包含继承方法 | |-----------------------|----------------|------------------|------------------| | `getMethod` | 当前类 + 父类 | 仅`public` | 是 | | `getDeclaredMethod` | 仅当前类 | 所有权限 | 否 | | `getDeclaredMethods` | 仅当前类 | 所有权限(数组) | 否 | --- ### 使用场景建议 1. **获取公共方法(包括继承)** → `getMethod()` 2. **获取类内部私有方法** → `getDeclaredMethod()` + `setAccessible(true)` 3. **遍历类自身所有方法** → `getDeclaredMethods()` --- ### 注意事项 - 反射操作可能破坏封装性,需谨慎使用。 - 调用非`public`方法前必须通过`setAccessible(true)`绕过访问检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值