Java 基础【18】 反射与内省

1.反射和内省的概念定义

   Java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的 class,核心类 java.lang.Class。

   通过把指定的类中各种元素成分都映射成 java.lang.reflect 反射包中的相应类,使得我们可以动态的调用类的相应成员.比如构造方法、成员方法、成员变量等。

        //JDK 反射API
        public static Class<?> forName(String className)

        //通过配置灵活加载不同数据库驱动
        Class.forName(driver);

   运行时获取任意类的成员方法:

        Class<String> stringClass = String.class;
        //获取声明的所有方法(不包括继承方法)
        Method[] methods = stringClass.getDeclaredMethods();
        //获取所有方法
        Method[] methods1 = stringClass.getMethods();
        //获取特定方法
        Method indexOf = stringClass.getMethod("indexOf", int.class);

   运行时获取任意类的成员变量:

        //获取所有类属性
        Field[] fields = stringClass.getFields();
        //获取声明的所有成员属性(不包括继承属性)
        Field[] declaredFields = stringClass.getDeclaredFields();
        //获取特定字段
        Field hashField = stringClass.getDeclaredField("hash");

   运行时调用任意类的方法:

        Constructor<String> constructor = stringClass.getConstructor(String.class);
        String newInstance = constructor.newInstance("orson");
        Object invoke = indexOf2.invoke(newInstance, "n");

   在运行时实例化对象并访问对应字段和方法比直接 new 一个对象来操作到底有什么好处呢?

   最主要的是提高灵活性和可扩展性, Spring 托管类、Struts 请求映射 Action、Hibernate 填充实体属性这些过程,反编译源码你都会看到反射。

   通过修改配置文件类文件的“描述”,不需要修改代码和编译,进行动态有必要的加载。

   很多开源项目都对 JDK 底层反射进行了封装,提供了简洁的 API 接口方便使用,如 apache-common、hutool等,这里就不赘述了。

猜你喜欢

转载自www.cnblogs.com/java-class/p/10078240.html