类的加载机制
- 类加载:一旦某个类被载入JVM中,同一个类就不会再次加载
反射的定义
- Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审",并能直接操作程序的内部属性。
- 使用反射可以获得Java类中各个成员的名称并显示出来。简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。
- —句话:运行时探究和使用编译时未知的类。
反射的原理
对象创建过程:比如要创建Dog类的三个对象
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog d3 = new Dog();
在这个过程中,JVM的底层实现过程如下:
1.JVM利用DogClassLoader先将Dog类加载到内存,然后马上产生了一个Class类型的对象,该对象可以看成是一个模型,以后无论创建多少个Dog类的实例都是利用该模型来生成。
所以一个类所对应的Class类型的对象只有一个。
2.根据这个模型生成Dog类的三个实例d1、d2、d3。反射正是利用了java的这种加载方式主动完成了对象的创建及使用。
反射的使用步骤
- 三种获取class对象:
- 对象.getclass();
- 类名.class
- Class.forName(“包名.类名”)
- 探究类的信息
- 一个类通常由三部分组成—属性、普通方法、构造方法。
- Filed类
- field.setAccessible(false) 开启语法检查
- field.set();
- Method类
- Constructor类
- Method类
- Constructor类
- Modifier类 返修饰符
Class cla; //创建Class对象
cla.getField(""); //获取指定名称的公共属性
cla.getFields(); //获取指定名称的所有公共属性
cla.getDeclaredField(""); //获取指定名称的任意属性
cla.getDeclaredFields(); //获取所有属性
cla.getMethod(""); //获取指定名称的公共方法
cla.getMethods(); //读出对象的所有方法,包括继承object类和父类的所有方法
cla.getDeclaredMethod(""); //获取指定名称的任意方法
cla.getDeclaredMethods(); //获取所有方法时,只会获取当前类中显式出现的方法
cla.getConstructor(); //获取指定名称的公共构造函数
cla.getConstructors(); //获取指定名称的所有公共构造函数
cla.getDeclaredConstructor(); //获取指定名称的任意构造函数
cla.getDeclaredConstructors(); //获取所有构造函数*/
5. field.set();//反射机制中只要给定指定包名下的类名,无论对象的属性是私有还是公共的 都可以访问并修改,属于暴力破解。所以不能轻易使用 ,有很大隐患。
希望可以和大家互相学习,谢谢大家!