一 .什么是反射:
java中提供的一套类库,通过这套类库
—运行时动态获取类中的信息
—运行时动态调用构造函数创建对象
—运行时动态访问(调用)对象的方法和属性
这种在运行期间动态获取类中的信息(属性,方法,包,注解)
以及动态调用对象的方法和属性的功能称之为java语言的反射机制
通俗的理解,在运行期间对类的内容进行操作
特殊的类类型 是 Class类类型
Class类是java系统提供的,这个Class类可以表达任意一个类的信息(属性,方法,包,注解等)
----每个类加载后(方法区),系统都会为该类生成一个对应的Class类类型的对象,这个对象存储到堆区中,通过该Class对象就可以访问方法区中的类的信息
----一旦获取了某个类的Class对象之后,程序员可以写程序调用Class对象中的api方法,获取该Class对象中的类的信息
二 .如何获取堆区中的Class类型的对象
对象.getClass();
User user=new User();
Class clazz=user.getClass();
-类名.class
有一个类是User
Class clazz=User.class;
Class.forName("全路径类名");
Class clazz=Class.forName("com.tarena.entity.User");
选取上面三种方式之一,获取Class对象
通过Class对象可以获取对应类中的信息
-Field类:代表的是成员变量
-Method类:代表类中的方法
-Constructor类:代表类中的构造函数
-Annotation类:代表的是注解
通过上面类的api可以获取对应的信息
-可以获取Field中的信息,获取类的属性, 属性修饰符 属性类型 属性名称
-可以获取Method中的信息,获取类中的方法 修饰符 返回值 方法名称,方法的参数列表
-可以获取Constructor中的信息,构造函数 修饰符 构造函数的参数列表
-可以或获取Annotaion中的信息,注解信息 获取注解的属性值
-可以获取对应类的对象
结论:
在运行期间,通过Class对象调用反射的api
可以实例化对象
可以访问属性,可以调用方法
总之,静态能做的,反射动态也能实现
静态:常规写的程序
动态:用反射写的程序
介绍常规的反射的api:
-反射方式创建对象
1.实例化无参数构造
Class对象.newInstance();//常用
2.实例化有参数的构造
Class对象.getConstructor(new Class[]{若干参数的类型}).newInstance(构造函数的参数);
-反射方式获取Field中的的信息
1.获取当前类以及超类的public Filele
Field[] fields=Class对象.getFields();
2.获取当前类的所有的属性
Field[] fields=Class对象.getDeclaredFields();
3.获取当前类以及超类指定的公有的属性
Field field=Class对象.getFileld(String fileldName);
4.获取当前类指定的公有的属性
Field field=Class对象.getDeclaredFileld(String fileldName);
5.通过反射设定Field的值
Field对象.set(Object obj,Object value);
6.通过反射动态获取Field的值
Object value=Field对象.get(Object obj);
-反射方式获取Method方法信息
1.获取当前类以及超类的公有的方法
Method[] methods=Class对象.getMethods();
2.获取当前类所有的方法
Method[] methods=Class对象.getDeclaredMethods();
3.获取当前类以及超类的指定的公有方法
Method method=Class对象.getMethod(String methodName);
4.获取当前类指定的方法
Method method=Class对象.getDeclaredMethod(String methodName);
5.通过反射动态调用指定的Method
Object returnValue=Method对象.invoke(Object obj,object…args);
解析:就是用obj这个对象名调用Method对象确定的方法,给这个方法
传递args参数,方法的返回值是returnValue
-反射获取Constructor 构造函数
查api文档
-反射获取Annotaion 注解
查api文档
在哪些地方使用反射,反射应用场景
-用反射实现jdbc的通用查询和通用更新
-用反射解析注解
-单元测试,就是用反射实现的
-常见的框架 spring框架,springmvc框架等,都是反射实现的
-EL表达式
等等
反射的优点:
大幅度提高开发效率,框架就是用反射实现的,框架提高了开发效率
反射缺点:
反射的效率比非反射的方式效率低
反射可以暴露类的所有的细节,突破的封装(没底线)
内省:就是自查的意思,本质就是反射,利用反射自省类中属性,方法和其他
自省的实现方式有两种
方式一:
jdk中自带的一套自省api方法
方式二:
apache基金会提供了一套公共自省类库Commons-BeanUtils.jar
方式一api介绍:
Introspector
static BeanInfo getBeanInfo(Class<?> beanClass)
BeanInfo
MethodDescriptor[] getMethodDescriptors();
PropertyDescriptor[] getPropertyDescriptors();
PropertyDescriptor
PropertyDescriptor(String propertyName,Class<?> beanClass);
String getName();
Class<?> getPropertyType();
Method getReadMethod();
Method getWriteMethod();
方式二api介绍:
commons-beanutils实际上是对java原生反射api和
java的Introspector的封装
此工具集中包含若干工具
MethodUtils类:此类中的api操作方法的
ConstructorUtils类:此类中的api操作的构造函数
PropertyUtils类:此类中的api是操作属性的
BeanUtils类:此类的api操作的是bean对象的数据的
ConvertUtils类:此的api操作在对象的数据类型无法自动转换的时候需要此工具
等若干工具