反射基本介绍(一)
概述
定义
- java反射机制,主要是在java程序运行时,可以获取实体类的Fieldd域、method域、construction域并对其进行操作(运行方法、赋值、取值),并且常常用于各种框架中框架设计的灵魂例如spring
反射机制相关的类
类名 | 用途 |
---|---|
Class类 | 类的实体,其中包括了所有的类信息 |
Fieldd类 | 成员变量类的实体,通过内部函数获取其值或者属性 |
Method类 | 方法类的实体类,获取class中的所有方法 |
Construction类 | 初始化函数的实体类 |
- 以上是反射中常用的实体类
- 其中的关系如下
- 首先获取一个Class类之后可以从Class类中获取Fielddd、method、construction等实体类
- 获取相应的实体类
- 对相应的实体类进行操作
- 其中的关系如下
基本使用
主要类及其函数介绍
- Class类
- 如果获取Class类
//第一种:需要先有一个静态的实体类 Student student = new Student(); Class studentC = student.getClass(); //第二种:通过Class.Class类(依赖强不好) Class studentC2 = Student.class; //第三种:通过class静态方法(最常用) Class studentC3 = Class.forname("zzw.Student")//完全路径
- 如果获取Class类
- Class属性的相关方法
方法 | 用途 |
---|---|
getClassLoader() | 获取类加载器 |
getClasses () | 获取公共的类和接口 |
getDeclared() | 获取所有的类和接口 |
forname() | 静态方法,返回一个对应的类对象 |
newInstence | 返回一个类对象,相当于初始化 |
getPackage() | 获得类的包 |
getName() | 获得类的完整路径名字 |
getSuperclass() | 获得当前类继承的父类的名字 |
getInterfaces() | 获得当前类实现的类或是接口 |
- 获取Fieldd类的相关方法
方法 | 用途 |
---|---|
getField(String name) | 获取field公有域,通过名字 |
getFields() | 获取一个list集合field公有域 |
getDeclaredField(String name) | 获取某个field域 |
getDeclaredFields() | 获取所有的field域(包括私有) |
- 获取Method类的相关方法
方法 | 用途 |
---|---|
getMethod(String name,Class…<?> paremetertype) | 获取公共方法 |
getMethods() | 获取所有的公共方法 |
getDeclaredMethod(String name,Class…<?> paremetertype) | 获取某个方法(可以是私有的) |
getDeclaredMethods() | 获取所有方法(可以是私有的) |
- 获取Construction类的相关方法
方法 | 用途 |
---|---|
getConstruction(Class… <?> paremetertype) | 获取某个公有参数的构造函数 |
getConstructions() | 获取所有公有构造函数 |
getDeclaredConstruction(Class…<?> pare) | 获取所有构造函数 |
getDeclaredConstructions() | 获取所有的构造函数 |
- 判断类
方法 | 用途 |
---|---|
isAnnotation() | 是否注解 |
isAnonymousClass() | 是否匿名类 |
isArray() | 是否数组 |
isEnum() | 是否枚举 |
isInstance(Object obj) | 是否是自己的实例 |
isInterface | 是否是接口 |
isLocalClass() | 是否局部类 |
isMemberClass() | 是否内部类 |
- Field类
- 主要方法 get、set用于获取设置feild域值
- Method类
- invoke(Object obj,Object… paremetertype) 运行相关方法
- Construction类
- newInstence(Object… paremetertype) 初始化
实例
- 获取所有变量
- 获取类
- class.getFieldS();
- 遍历:getModifies 权限 getName
注意:getField()获取子类父类的变量方法
getDeclaredFields() 获取本类的所有变量
- 获取所有方法
- 获取类
- class.getMethods;其中getDeclaredMethods与之前相同
- 遍历主要有一下几点 获取method.getModifies() 获取异常 获取参数 获取返回类型
- 修改变量的值
-
私有方法
- 获取class
- 获取class.getDeclaredMethods();
- method.setAccessible(ture);//私有方法获取访问权限,但是不会改变(否者会抛出IllegalAccessException)
- method.invoke() //调用
-
私有变量
- 同上
- field.set(class,"修改值);
-
私有常量
- 同上
思考:是否可以修改为什么
1.首先什么是常量定义:是被final修饰的变量
2.其次是jvm的编译优化,会对.class文件进行优化把一些字符常量引用直接转换成具体字符串
其中会优化的有数据有 int double string boolean,不会进行优化的有基础数据类型的包装类例如integer 、object
3.反射是对class文件进行操作的所有进行优化后就无法对值进行修改解决办法:核心思想破坏这种优化
- 定义时不对其进行赋值,初始化时进行赋值
- 定义时使用一些需要计算的例如三目运算符,这样编译时就不会进行优化例如
private final String FINAL_VALUE = null == null ? “FINAL” : null;
- 同上
-
总结
- 反射的基本使用思路和常用的一些函数已经介绍完毕之后会继续完善关于
- 1.反射的实现原理
- 2.常用的反射jar包
- 3.在设计模式及其spring中的使用
fighting!!!