反射的概念和特点:
java的三大特性:封装 继承 多态
java的核心思想: 面向对象 万事万物皆对象
java的类: 具备相同特征的对象的模板
一个类的具体对象可以存储一个类的所有信息; 可以 创建一个类保存类的所有信息。
一个类可以表示一个类的属性,方法,构造器方法。比如 属性都包括修饰符 类型 属性 值 那么专门创建一个类 来保存这些 特征。
理解:之前NEW对象 就相当于告诉你 我要得到这个对象 ,然后进行操作 即操作的是这个对象的东西
而反射是获得这个类的图纸 然后我要操作某个属性或者方法,然后操作时候再传参告诉系统我要操作哪个对象的 属性或者方法 class.newInstance表示创建对象
class Tclass {
private Fileds[] fs; // 存储类的所有的属性
private Methods[] method; //存储类的所有方法
private Controcter[] ct; //存储类的所有构造器方法
}
class Fileds{
private String modifier ; //存储属性的修饰符
private String ttype; //存储属性的类型
private String fname; //存储属性的名字
private String fvalue; //存储属性的值
}
Tclass就好比java 中的Class 类相当于图纸 可以依照图纸创建类 Class好比将类撕碎放进Class中,具有图纸所有内容 所以也可以创建对象
反射的概念和作用:
反射的概念: 完事万物皆对象 类也是对象
通过反射创建类对象和使用类对象
反射的作用:创建对象
原因: 传统创建对象方式的前提是知道 类名 new 类名( ) 如果修改使用的类或者无法确定执行那个对象 要修改源码 (静态的方法)
解决: 使用反射
创建类对象
操作属性
获取类的属性 getFielld 返回的是类和父类的公共属性 getDeclaredFields 返回的是所有的属性
获取父类的非公共属性 getSuperclass.getDeclaredField("属性名")
操作静态属性 Fild fl =cla. getDeclaredFields()
f1. get(null) 此处本应该传一个对象名 但是静态变量
所有对象 都用一个 所有直接Null就可以
操作非静态属性 f1. get(cla.newInstanc()) 即得到这个对象的
cla.newInstanc()表示新创建一个实例化对象类似于new 对象
因为cla是图纸 可以创建N个对象 所以非静态要get(cla.newInstanc())
操作方法
拿到方法
操作方法 用invoke函数 .invoke(对象(调用哪个),对象(参数))
操作构造器
反射的特点: 实现了java对象的动态创建
反射的缺点:代码效率低 影响程序性能
反射获取类对象的三种方式
①Class.ForName() 根据全限定路径获取 Class cla =Class.forName("地址") Object obj =cla.newInstance()
创建类对象时候用的较多
②对象名.getClass() 根据对象获取
调用底层使用反射封装的方法 主要用于类对象的操作 就是静态创建的对象调用反射的方法 比如一个类要调用class的 方法所以要转换成Class类型
③类名.class 根据类名获取 与②原理相同
第一个主要是创建类对象 第二个第三个主要是操作类对象较多
Class其中有一个方法是返回修饰符 以Int的形式返回 每一个操作符的int值都不同,所有两个修饰符 public static 这个相 加的和也和其他的不同 则就可以区分出他的修饰符
区分:类对象是 反射获取的 只有一个 类的对象 有好多个 比如 new 类名()