Java学习笔记 https://github.com/SnailDev/java-learning 和我一块儿启程...java
在运行状态中, 对于任意的一个类,都可以知道这个类的全部属性和方法; 对于任意的一个对象,都可以调用他的任意一个方法和属性; 这种动态获取类的信息以及动态调用对象的方法的功能称作Java的反射机制。git
- 只要给定类的全名,便可获取类的所用信息;
- 运行时获取任意一个对象所属的类对象;
- 运行时获取类中全部属性对象,可对其操做(包含私有属性);
- 运行时获取类中、父类中全部方法,可对其调用。
目前主流的应用框架如Struts二、Hibernate、Spring、SpringMVC等的核心所有都是利用Java的反射机制来实现的。github
- Class
- Constructor
- Field
- Method
- getName() 得到类中完整名称
- getDeclaredFields() 获取类中全部属性(含私有)
- getDeclaredMethods() 获取类中全部方法(含私有)
- getConstructors() 获取类的构造方法(不含私有)
- newInstance() 实例化类的对象(类的构造方法中参数需为空)
- 利用Class类forName()静态方法传入一个类的全路径来返回相对应的Class对象;
- 将实例化的类对象转成Object对象,再经过Object对象的getClass()方法来返回对应类的Class对象;
- 经过类的class属性来返回类的Class对象。
即数组
- Class.forName("要加载的类名")
- 对象名.getClass()
- 类名.class
- 用上述三种方式之一获取特定类的Class类,即该类对应的字节码
- 调用Class对象的getConstructor(Class<?>... parameterTypes)获取构造方法对象
- 调用是构造方法类Constructor的newInstance(Object... initargs)方法新建对象
- 调用Class对象的getMethod(String name, Class<?>... parameterTypes)获取方法对象(用方法的参数类型惟一标识一个方法,依据:方法的重载)
- 调用方法对象类Method的invoke(Object obj, Object... args)方法,调用对象上相应方法
类的构造函数反射类,经过getConstructors()方法能够得到类的全部构造函数反射对象数组。其中最主要的一个方法就是newInstance(),经过该方法能够建立一个对象类的实例,至关于new关键字。bash
- getName() 获取属性名称
- getType() 获取属性类型
- get(Object obj) 获取obj对象中这个属性的值
- set(Object obj, Object value) 向obj对象中这个属性赋值value
- setAccessible(boolean flag) 启用/禁用访问控制权限
- Field[] getDeclareFields() 获取类中全部的属性信息(含私有)
- Field[] getFields() 获取类中全部的公共属性信息(即不含私有)
- getName() 获取方法名称
- getReturnType() 获取方法返回类型
- invoke(Object obj,Obeject... args) 利用obj对象调用该方法
- getParameterTypes() 获取方法全部参数类型,按照顺序返回Class数组
- getDeclaredAnnotations() 获取方法的全部注解
- Method[] getDeclareMethods() 获取类中全部的方法信息(含私有);
- Method[] getMethod(String name, Class<?>... paramterTypes) 获取某个特定的方法,第一个参数为方法名称,第二个参数为方法参数的类对象(当方法具备多个参数时,传入的是Class数组;当方法参数为0个时,传入null);
数组的反射框架
hashCode 与内存泄漏问题函数
内省(Introspector) & JavaBean工具
JavaBean-是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。学习
JavaBean的分类spa
- 侠义的JavaBean
- 私有的字段(Field)
- 对私有字段提供存取方法(读写方法)
- 广义的JavaBean
- 私有的字段(Field)
- 对私有字段提供存取方法(读写方法)
- 数量任意的业务方法
内省(IntroSpector)是Java语言对JavaBean 类属性、事件的一种处理方法。
JavaBean读取属性x的值的流程:变大写、补前缀、获取方法。
"x"-->"X"-->"getX"-->"MethodGetX"
- 简单实现 使用java.beans.PropertyDescriptor类
- 复杂实现 使用java.beans.Introspector类,遍历getBeanInfo方法的返回值
- 使用BeanUtils工具包
- 字符串和整数转换(对比(PropertyUtils)
- 属性级联操做
- 操做map
Java学习笔记 https://github.com/SnailDev/java-learning 和我一块儿启程...