反射从0到入门 (5)

看一下示例代码:

public class MethodTest1 {
    public static void main(String[] args) throws Exception{
        Class c = Student.class;
        // 获取public方法getScore,参数为String;
        System.out.println(c.getMethod("getScore",String.class));
        // 获取继承的public方法getName,无参数;
        System.out.println(c.getMethod("getName"));
        // 获取private方法getGrade,参数为int;
        System.out.println(c.getDeclaredMethod("getGrade",int.class));
    }
}

运行结果:

public int com.javastudy.reflection.Methods.Student.getScore(java.lang.String)
public java.lang.String com.javastudy.reflection.Methods.Person.getName()
private int com.javastudy.reflection.Methods.Student.getGrade(int)
获取 Method 的信息

一个 Method 对象包含了一个方法的所有信息:

getName():返回方法名称,例如:「getScore」

getReturnType():返回方法的返回值类型,是一个 Class 实例,例如:「String.class」

getParameterTypes():返回方法的参数类型,是一个 Class 数组,例如:{String.class, int.class}

getModifiers():返回方法的修饰符,和 Field 的 getModifiers() 大同小异

示例如下:

public class MethodTest2 {
    public static void main(String[] args) throws Exception{
        Class c = Student.class;
        Method method= c.getDeclaredMethod("getGrade",int.class);

        System.out.println("name : " + method.getName());
        System.out.println("returnType : " + method.getReturnType());
        Class<?>[] parameterTypes = method.getParameterTypes();
        System.out.println("paramaterTypes的长度 : " + parameterTypes.length);
        for (Class parameterType : parameterTypes){
            System.out.println("paramaterTypes : " + parameterType);
        }
    }
}

运行结果:

name : getGrade
returnType : int
paramaterTypes的长度 : 1
paramaterTypes : int
调用方法 调用普通方法

先看示例:

public class MethodTest3 {
    public static void main(String[] args) throws Exception {
        String s = "不是秃头的小李程序员";
        Method method = String.class.getMethod("substring"int.class);
        Method method2 = String.class.getMethod("substring"int.class, int.class);
        String result = (String) method.invoke(s,7);
        String result2 = (String) method2.invoke(s,1,9);
        System.out.println(result);
        System.out.println(result2);
    }
}

运行结果:
程序员
是秃头的小李程序

分析下程序员小李是如何秃头的:

通过 Class 实例的 getMethod 方法获取Method,getMethod 的 name 和参数不同,获取的 Method 也是不同的。

使用 Method 的 invoke 方法就相当于调用该方法。invoke 的第一个参数是对象实例,后面的可变参数与方法参数一致,否则将报错。

调用静态方法

调用静态方法,无需指定实例对象,invoke 方法传入的第一个参数永远是 null 或者空值 ”“,我们看下面的例子:

public class MethodTest4 {
    public static void main(String[] args) throws Exception{
        // 获取Integer.parseInt(Stirng)方法,参数是String
        Method method = Integer.class.getMethod("parseInt", String.class);
        // 调用静态方法获取结果
        // Integer result = (Integer)method.invoke("", "12345");
        Integer result = (Integer)method.invoke(null"12345");
        System.out.println(result);
    }
}

运行结果:12345
调用非public方法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfwdg.html