getDeclaredMethod和getMethod的区别

看了api文档,容易忘记,还是敲一遍吧,得出结论,加深记忆~

结论

加了Declared:只能获取当前类的方法,包括私有方法(不能invoke)

不加Declared:可以获取当前类以及超类的方法,但只能是public方法。不能invoke本地(native)方法

代码示例

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

class A {

    private String name = "A";

    public Byte age = 21;

    public String publicMethodOfA() {
        return "I am publicMethodOfA";
    }

    private  String privateMethodOfA() {
        return "I am privateMethodOfA";
    }

    public String noExtendsMethodOfA() {
        return "I am noExtendsMethodOfA";
    }
}

class B extends A {

    private String name = "B";

    private Byte age = 22;

    @Override
    public String publicMethodOfA() {
        return "I am publicMethodOfB override A";
    }

    public String publicMethodOfB() {
        return "I am publicMethodOfB";
    }

    String privateMethodOfB() {
        return "I am privateMethodOfB";
    }
}

public class Test {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        A a = new A();
        B b = new B();
//        Method getDeclaredMethod(String name, Class… parameterTypes)
//        返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法(可以获取私有)。
        System.out.println("-------------getDeclaredMethod---------------");
        Method method1 = b.getClass().getDeclaredMethod("publicMethodOfA");
        System.out.println("b.getClass().getDeclaredMethod(publicMethodOfA)   " + method1.getName() + " : " + method1.invoke(b));
        try {
            method1 = b.getClass().getDeclaredMethod("noExtendsMethodOfA");
            System.out.println("b.getClass().getDeclaredMethod(noExtendsMethodOfA)    " + method1.getName() + " : " + method1.invoke(b));
        } catch (Exception e) {
            System.out.println("getDeclaredMethod 不能获取未重写的父类方法");
        }
        System.out.println();

//        Method[] getDeclaredMethods()
//        返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法(如果继承方法在子类中实现,就可以获得到)
        System.out.println("-------------getDeclaredMethods---------------");
        Method[] methods = b.getClass().getDeclaredMethods();
        for (Method method : methods) {
            if (method.getModifiers() == Modifier.PUBLIC) {
                System.out.println(method.getName() + " : " + method.invoke(b));
            } else if (method.getModifiers() == Modifier.PRIVATE) {
                System.out.println(method.getName() + " :  getDeclaredMethods 获取到的private方法不能被执行,只能获取方法信息");
            }
        }
        System.out.println();

//        Method getMethod(String name, Class… parameterTypes)
//        返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法(不包括私有,但可以获得父类中未被继承的方法)。
        System.out.println("-------------getMethod---------------");
        Method method = b.getClass().getMethod("noExtendsMethodOfA");
        System.out.println("b.getClass().getMethod(noExtendsMethodOfA)   " + method.getName() + " : " + method.invoke(b));
        try {
            method = b.getClass().getMethod("privateMethodOfB");
            System.out.println("b.getClass().getMethod(privateMethodOfB)   " + method.getName() + " : " + method.invoke(b));
        } catch (Exception e) {
            System.out.println("getMethod 只能获取类的公共方法");
        }
        System.out.println();

//        Method[] getMethods()
//        返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
        System.out.println("-------------getMethods---------------");
        methods = b.getClass().getMethods();
        for (Method method2 : methods) {
            if (method2.getModifiers() == Modifier.PUBLIC) {
                try {
                    System.out.println(method2.getName() + " : " + method2.invoke(b));
                } catch (Exception e) {
                    if (method2.getParameterCount() != 0) {
                        System.out.println(method2.getName() + " : " + "方法执行需要参数,此处不尝试invoke");
                    } else {
                        System.out.println(method2.getName() + " :不能invoke");
                    }
                }
            } else if (method2.getModifiers() == Modifier.PRIVATE) {
                System.out.println(method2.getName() + " :   getMethods 获取到的private方法不能被执行,只能获取方法信息");
            } else {
                System.out.println(method2.getName() + " 方法的修饰符不等于1 且不等于2,不尝试invoke");
            }
        }
        System.out.println();
    }
}

执行结果

-------------getDeclaredMethod---------------
b.getClass().getDeclaredMethod(publicMethodOfA)   publicMethodOfA : I am publicMethodOfB override A
getDeclaredMethod 不能获取未重写的父类方法

-------------getDeclaredMethods---------------
publicMethodOfA : I am publicMethodOfB override A
publicMethodOfB : I am publicMethodOfB

-------------getMethod---------------
b.getClass().getMethod(noExtendsMethodOfA)   noExtendsMethodOfA : I am noExtendsMethodOfA
getMethod 只能获取类的公共方法

-------------getMethods---------------
publicMethodOfA : I am publicMethodOfB override A
publicMethodOfB : I am publicMethodOfB
noExtendsMethodOfA : I am noExtendsMethodOfA
wait 方法的修饰符不等于1 且不等于2,不尝试invoke
wait 方法的修饰符不等于1 且不等于2,不尝试invoke
wait 方法的修饰符不等于1 且不等于2,不尝试invoke
equals : 方法执行需要参数,此处不尝试invoke
toString : com.vdian.chaim.B@3af49f1c
hashCode 方法的修饰符不等于1 且不等于2,不尝试invoke
getClass 方法的修饰符不等于1 且不等于2,不尝试invoke
notify 方法的修饰符不等于1 且不等于2,不尝试invoke
notifyAll 方法的修饰符不等于1 且不等于2,不尝试invoke
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值