1.反射和内省的概念定义
java 反射机制容许程序在运行时加载、探知、使用编译期间完全未知的 class,核心类 java.lang.class。
通过把指定的类中各种元素成分都映射成 java.lang.reflect 反射包中的相应类,使得我们可以动态的调用类的相应成员.比如构造方法、成员方法、成员变量等。
java 内省(introspector)是对 bean 类属性、事件的一种缺省处理方法,核心类 java.beans.introspector。
通过 java.beans 包下一套 api 来访问 javabean 的getter/setter方法。
//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等,这里就不赘述了。
如对本文有疑问, 点击进行留言回复!!
springcloud中feign调用处理mybatis-plus Ipage反序列化问题。
Flume 史上最全面的大数据学习第十篇(一) 别再说不知道flume是什么了
网友评论