zoukankan      html  css  js  c++  java
  • Java 基础【18】 反射与内省

    1.概念定义

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

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

       Java  内省机制(IntroSpector)是对 JavaBean 属性、事件的一种默认处理方法,核心类 java.beans.BeanInfo。

       通过 java.beans 包下一套 API 来访问 javaBean 的 getter/setter方法。

    2.JDK API 使用例子

            //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 填充实体属性这些过程,反编译源码你都会看到反射。

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

       内省基于反射实现,主要是来简化 JavaBean 的赋值与取值,如果你使用过 Struts 表单到后台 Action 字段填充核心就是内省。

            UserDTO userDTO = new UserDTO();
            //内省使用 setter 方法设置特定 javaBean 属性
            PropertyDescriptor userName = new PropertyDescriptor("userName", UserDTO.class);
            Method writeMethod = userName.getWriteMethod();
            writeMethod.invoke(userDTO,"userA");
    
    
            //内省使用 getter 方法获取特定 javaBean 属性
            Method method = userName.getReadMethod() ;
            Object result = method.invoke(userDTO) ;

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

  • 相关阅读:
    c++ 类 总结
    SQLite入门与分析(四)Page Cache之事务处理(3)
    SQLite入门与分析(三)内核概述(1)
    SQLite入门与分析(八)存储模型(1)
    glibc笔记——strlen
    SQLite入门与分析(二)设计与概念
    线性时间选择问题——分治
    SQLite入门与分析(二)设计与概念(续)
    浅谈c语言中的字符串
    SQLite入门与分析(六)再谈SQLite的锁
  • 原文地址:https://www.cnblogs.com/java-class/p/10078240.html
Copyright © 2011-2022 走看看