引用
之前如何使用类和对象:
定义类,使用的时候是类的实例(对象)
Uer类(构造方法,属性,方法。。。)
User user =new User();
在那儿用就创建该类的对象使用即可
类名就是类在项目中的地址,通过地址找到类,就可以动态的获取类中的信息
以前在我们自己的项目中就是在那儿用就在那儿new,这样代码就是写死的
但是框架需要处理不同的类,都需要能够进行处理
mybatis框架可以写一个方法,会接受一个类的地址,可以根据地址创建该类的对象,这样框架就可以实现以不变应万变
如何实现、使用反射机制
反射:在程序的运行过程中,我们可以动态的获取类的信息,以及创建类的对象,以及调节对象中的属性和方法
作用:动态获取类的信息(类的地址
好处:写一个方法,可以处理任何的类
反射的基本用法
Class类
如何动态获得类的信息
User.java-->User.class-->一旦程序中使用User类,就会加载字节码文件,为类创建一个Class类的对象,我们可以通过该类的Class对象,获得类中的信息
public class Test1 {
public static void main(String[] args) throws ClassNotFoundException {
/*
获得类的class对象
* */
//方式1,通过对象名活动到类的Class对象
User user=new User();
Class c1=user.getClass();
//2 通过类名,class或得到类的Class对象
Class c2=User.class;
System.out.println(c1==c2);//true
//3 通过Class.forName(“类的地址”)
String cname="com.ffyc.javareflect.User";
Class c3=Class.forName(cname);
System.out.println(c1==c3);//true
}
}
1.通过类名,对象,类的地址(字符串)获得类的Class对象,这样就变为统一的类型,通过Class中的方法获取信息
2.拿到类的Class对象后,获得类中的属性,构造方法,方法····、以前在项目中使用类,是正向使用,知道类名,呢我累的对象,使用
在一些框架/组件中为了可以对任意的类进行处理,所以需要获得Class对象,通过类的Class对象获取类信息,创建对象
getField(name);//获得指定名称公共权限
getDeclaredField("name");//获得指定名称私有权限
getFields();//获得所有公共权限
Construor类
getConstructor(); 获得类中构造方法,获得公共权限构造方法
getDeclaredConstructor(类<?>...parameterTypes) 可以获得私有的构造方法
setAccessible(true/false); 设置对私有权限构造方法进行操作
newInstance(); 通过构造方法,创建对象
Field类
获得类中的属性:
getField ("name"); 获得的是指定名称公共权限属性
getFields(); 获得所有公共权限属性
getDecLaredField("name"); 获得的是指定名称私有权限属性
getDeclaredFields(); 获得类中所有的成员方法(包含私有的)
Method类
getMethods(); 获得类中所有的公共的成员方法
getMethod("name",type); 获得公共的指定名称参数的成员方法
invoke(object,para); 调用类代表的方法
getDeclaredMethod(name,type); 获得私有的指定名称参数的成员方法
优点:在运行时可以动态获取任意类的信息,创建对象,调用对象方法属性,提高代码灵活性,复用性
缺点:
- 需要对类信息进行解析判断处理,效率相对较低
- 使用反射机制可以操作私有的成员,会打破封装性