栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

22.反射获取方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

22.反射获取方法

来自:

Java教程 - 廖雪峰的官方网站研究互联网产品和技术,提供原创中文精品教程https://www.liaoxuefeng.com/wiki/1252599548343744

Class 类提供了以下几个方法来获取 Method:

Method getMethod(name, Class...):获取某个 public的 Method(包括父类)Method getDeclaredMethod(name, Class...):获取当前类的某个 Method(不包括父类)Method[] getMethods():获取所有 public的 Method(包括父类)Method[] getDeclaredMethods():获取当前类的所有 Method(不包括父类)

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

getName():返回方法名称,例如: "getScore";getReturnType():返回方法返回值类型,也是一个Class实例,例如: String.class;getParameterTypes():返回方法的参数类型,是一个Class数组,例如: {String.class, int.class};getModifiers():返回方法的修饰符,它是一个 int,不同的bit表示不同的含义。

小结

Java的反射API提供的Method对象封装了方法的所有信息:

通过 Class实例的方法可以获取 Method实例: getMethod(), getMethods(), getDeclaredMethod(), getDeclaredMethods();

通过 Method实例可以获取方法信息: getName(), getReturnType(), getParameterTypes(), getModifiers();

通过 Method实例可以调用某个对象的方法: Object invoke(Object instance, Object... parameters);

通过设置 setAccessible(true)来访问非 public方法;

通过反射调用方法时,仍然遵循多态原则。

import java.lang.reflect.Method;
public class MethodTest {
        public static void main(String[] args) throws Exception {
            // String对象:
            String s = "Hello world";
            // 获取String substring(int)方法,参数为int:
            Method m = String.class.getMethod("substring", int.class);
            // 在s对象上调用该方法并获取结果:
            String r = (String) m.invoke(s, 6);
            // 打印调用结果:
            System.out.println(r);
        }
}
输出:
world

import java.lang.reflect.Method;
public class MethodTest {
        public static void main(String[] args) throws Exception {
            // 获取Integer.parseInt(String)方法,参数为String:
            Method m1 = Integer.class.getMethod("parseInt", String.class);
            // 调用该静态方法并获取结果:
            Integer n = (Integer) m1.invoke(null, "12345");//Method表示一个静态方法,调用静态方法时,由于无需指定实例对象,所以invoke方法传入的第一个参数永远为null
            // 打印调用结果:
            System.out.println(n);

            Person p = new Person();
            Method m = p.getClass().getDeclaredMethod("setName", String.class);
            m.setAccessible(true);//某个SecurityManager可能不允许对java和javax开头的package的类调用setAccessible(true),这样可以保证JVM核心库的安全。
            m.invoke(p, "Bob");
            System.out.println(p.name);
        }
    }

    class Person {
        String name;
        private void setName(String name) {
            this.name = name;
        }
}
//使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。
输出:

12345

Bob

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号