- 反射
- 概念:反射是一种机制,利用该机制可以在程序运行过程中对类进行解饱并操作类的方法,属性,构造方法等成员。
- 使用反射机制解刨类的前提:必须获取到该类的字节码文件对象,即Class类型对象。
- 反射使用的统一步骤:
- 1.获取Class对象
- 2.要操作谁,就找到谁
- 1.操作构造方法:要获取Constructor对象,getConstructor() getDeclaredConstructor()
- 2.普通操作方法:要获取Method对象:getMethod,getDeclaredMethod()
- 3.操作属性字段:要获取Field对象:getField(),getDeclaredField()
- 3.如果操作的是private,需要提前设置需要暴力反射:setAccessible(true)
- 4.反射操作:
- 1.操作构造方法:newInstance()
- 2.操作普通方法:invoke()
- 3.操作属性字段:get(),set()
- 获取Class对象的Method信息(成员方法)
- 概述:Method是方法类,类中的每一个方法都是Method的对象,通过Method对象可以 调用方法。
- 特点:比普通方式麻烦,比普通方式强大。
- Class类中与Method相关方法
- Method getMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,只能是获取public修饰
- Method getDeclaredMethod("方法名", 方法的参数类型... 类型) 根据方法名和参数类型获得一个方法对象,包括private修饰的
- Method[] getMethods() 获取所有的public修饰的成员方法,包括父类中。
- Method[] getDeclaredMethods() 获取当前类中所有的方法,包含私有的,不包括父类中。
- Constructor类中常用的方法
- 1. T newInstance(Object... initargs) 根据指定参数创建对象。
- 2. void setAccessible(true) 暴力反射,设置为可以直接访问私有类型的构造方法。
- 获取Class对象的Constructor信息
- Constructor类概述:Constructor是构造方法类,类中的每一个构造方法都是Constructor的对象,通过 Constructor对象可以实例化对象。
- 1.获取Class对象的三种方式:得到Class对象的三种方式.
- 方式1:通过类名.class获取 Class clazz=类名.class;
- 方式2:通过Object类的成员方法getClass()方法获取 Class clazz=对象.getClass()
- 方式3:通过Class.forName("权限定类名")方法获取 Class.clazz=Class.forName("java.lang.String");
- 常用方法:
- clazz.getName():获取全限定类名.
- clazz.getSimpleName():获取简单类名(不包含包名)
- clazz.newInstance():生成类的实例对象。
- 反射使用的统一步骤:
- 2.得到并操作Constructor(反射) 生成一个类的实例对象,不是通过普通的new方式,而是通过反射。
- 获取Constructor
- clazz.getConstructor(Class... argTypes):获取的是public类型的构造方法
- clazz.getDeclaredConstructor(Class... argTypes):获取的是任意类型的构造方法
- clazz.getConstructors():获取所有public类型的构造方法Constructor数组
- clazz.getDeclaredConstructors():获取所有任意类型的构造方法Constructor数组
- 反射调用Constructor
- constructor.newInstance(Object... argValues):生成类的实例对象
- 参数argValues:构造方法的实参值
- constructor.setAccessible(true):设置Constructor允许暴力反射
- 如果是要操作private类型的Constructor,就需要提前设置允许暴力反射
- constructor.newInstance(Object... argValues):生成类的实例对象
- 获取Constructor
- 3.得到并操作Method(反射)
- 获取到Method
- clazz.getMethod(String methodName, Class... argTypes):获取public类型的方法
- clazz.getDeclaredMethod(String methodName, Class... argTypes):获取任意类型的方法
- clazz.getMethods():获取所有public类型的方法Method数组(自己的和父类的)
- clazz.getDeclaredMethods():获取所有任意类型的方法Method数组(自己的)
- 反射调用Method
- method.invoke(Object target, Object... argValues):反射调用方法
- 参数:
- target:调用哪个对象的方法
- argValues:方法的实参
- 返回值:方法的返回值
- 参数:
- method.setAccessible(true):设置方法允许暴力反射
- method.invoke(Object target, Object... argValues):反射调用方法
- 获取到Method
- 4.得到并操作Field(反射)
- 获取到Field对象
- clazz.getDeclaredField(String fieldName):获取指定名称的属性(任意类型)
- clazz.getField(String fieldName):获取指定名称的属性(public类型)
- clazz.getDeclaredFields():获取所有任意类型的属性,得到Field数组
- clazz.getFields():获取所有public类型的属性,得到Field数组
- 反射操作Field对象
- field.set(Object target, Object value):设置属性值
- target:设置哪个对象的属性值
- value:设置的值
- field.get(Object target):获取属性值
- field.setAccessible(true):设置允许暴力反射
- field.getType():获取属性类型
- field.set(Object target, Object value):设置属性值
- 获取到Field对象
- BeanUtils工具包
- 概述:BeanUtils是Apache commons组件的成员之一,主要用于简化JavaBean封装数据 的操作。常用的操作有以下三个:
- 对JavaBean的属性进行赋值和取值。
- 将一个JavaBean所有属性赋值给另一个JavaBean对象中。
- 将一个Map集合的数据封装到一个JavaBean对象中。
- 使用BeanUtils
- BeanUtils.setProperty(Object bean, String fieldName, Object fieldValue):设置属性值
- BeanUtils.getProperty(Object bean, String fieldName):获取属性值
- BeanUtils.populate(Object bean, Map<String,Object> map):把map里的数据封装到JavaBean对象里
- 概述:BeanUtils是Apache commons组件的成员之一,主要用于简化JavaBean封装数据 的操作。常用的操作有以下三个:
- JavaBean概述
- 1.JavaBean就是一个类,但该类需要满足以下三个条件:
- 类必须使用public修饰。
- 提供无参数的构造器。
- 提供getter和setter方法访问属性
- 2.JavaBean的两个重要概念:
- 字段:就是成员变量,字段名就是成员变量名。
- 属性:属性名通过setter/getter方法去掉set/get前缀,首字母小写获得。
- 注意:创建JavaBean的时候,要保证字段名和属性一致。使用idea快捷键生成,而不要自己手写
- 1.JavaBean就是一个类,但该类需要满足以下三个条件:
- 注解
- 什么是注解
- 注解:Annotation,是和class、inteface同一等级的代码说明。是一种记号,记号本身没有功能,是其它软件、其它代码增加的功能。
- 注解的作用和JDK中常用的注解:
- @Override:被@Override标记的方法,idea/eclipse会提供功能:检查语法
- @Deprecated:被@Deprecated标记的方法,idea/eclipse会提供功能:把使用方法的代码划掉
- @SupressWarning:压制警告,idea/eclipse不会显示警告信息
- 辅助生成的文档:
- @author:作者
- @version:版本
- 代替生成的xml配置文件:
- @WebServlet:Tomcat软件提供的,用于配置Servlet,代替web.xml的
- 自定义注解:
- 语法:@元注解public @interface 注解名{属性类型 属性名称() default 默认值;}
- 元注解:用来限制自定义注解的注释
- 常用的元注解有两个:
- @Target:用来限制自定义注解可以用在什么地方。从ElementType里取值的,常用值有:
- ElementType.TYPE:可以用在类、接口上
- ElementType.METHOD:可以用在方法上
- ElementType.FIELD:可以用在成员变量上
- @Retention:用来限制自定义注解保留到什么阶段(生命周期)。从RetentionPolicy里取值,常用的:
- RetentionPolicy.SOURCE:保留到源码阶段
- RetentionPolicy.CLASS:保留到字节码阶段
- RetentionPolicy.RUNTIME:保留到运行阶段
- @Target:用来限制自定义注解可以用在什么地方。从ElementType里取值的,常用值有:
- 注解的属性,并非所有的类型都可以,只支持:
- 8种基本数据类型
- String类型
- Class类型
- 注解类型
- 枚举类型
- 以及以上类型的一维数组形式
- 注解的使用
- 使用注解的语法:@注解名(属性名=值, 属性名=值, ...)
- 注意:如果只有一个属性需要设置值,并且属性名称是value,可以简写成:@注解名(value的值)
- 注解的解析
- 给注解增加功能
- method.isAnnotationPresent(Class annotationClass):判断方法上是否有指定注解
- 什么是注解
反射注解详细介绍
最新推荐文章于 2023-11-03 13:16:51 发布