反射概念:旨在运行的状态中,动态获取信息及动态调用对象方法的功能
3个动态性质:
运行时生成对象的实例
运行期间调用方法
运行时更改属性
Classs继承Object
反射常用的类:
Class类:反射的核心,反射所有的操作都是围绕该类来生成的。通过Class类获取类的属性,方法等内容;
Filed类:表示类的属性,可获取和设置类中的属性的值
Method类:表示类的方法,用来获取类中方法的信息,或者执行方法;
Constructor类:表示类的构造方法;
1获取类的信息
第一步获取Class的对象
a 调用getClass()方法
Student p=new Student();
Class cla=p.getClass();不用知道类是什么,知道某个类的对象就可以返回该对象对应类的对象
可以不知道Student类的存在,知道去对象p就可以获取Student类对应的Class对象
b 调用class属性
Class cla=Student.class;
这种需要在编译期间就要知道类的名称
c 使用Class类的forName()静态方法:
这种需要在编译期间就要知道类的名称
括号内必须传入字符串,它必须是某个类的全名,类名前要添加完整的包名:
Class cla=Class.for("com.pb.jadv.reflection.Student");
每个类都有一个Class描述
创建对象
>>>>>使用Class对象的newInstance()创建对象 前提是类有默认的构造方法
Class cla=Love.class;
Love loeo;
loeo = (Love) cla.newInstance();
System.out.println(loeo.toString());
>>>>>使用Constructor对象创建对象 指定默认的构造方法
Class cla=Love.class;
Constructor cu = cla.getConstructor(String.class, int.class);
Love lolo = (Love) cu.newInstance("小王", 26);
System.out.println(lolo.toString());
方法:
访问不包含属性的方法
方法一
1 .Method getMethod(Stingsname,Class[][arams)//访问指定类型的方法
2.Method[] getMethods()//返回public 的Method数组
3.Method getDeclaredMethod(Stingsname,Class[][arams)//访问所有的方法中指定类型的方法,与属性级别无关
4Method[] getDeclaredMethods()//返回所有Method数组
访问包含属性的public
方法二
1.Filed getFiled(String name)//访问包含属性指定类型的public方法
2.Filed[] getFileds()//:》》》返回数组
3.Filed getDeclaredFiled(String name)//访问所有方法中指定属性类型的方法与属性级别无关
4.Filed[] getDeclaredFileds()//所有方法:》》》返回数组
访问类的属性Filed
通过 Xxx getXxx(Object obj)获取对象属性对应的(8基本数据类型)的属性值
Object get(Object obj) 获得对象的属性为引用类型属性值
void setXxx(Object obj,Xxx val) 把对象属性对应的的值设置为(8中)基本数据类型属性值
void set(Object obj,Xxx val) //把对象的属性设置为Val ,针对引用类型
void setAccessible(bool flg)对获取到的属性设置访问权限,true,可以对私有属性取值和赋值