看了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