反射
类加载器
- 负责将.class文件(存储的物理文件)加载在到内存中
- 类用到就加载,不用不加载,加载后就一直在
类加载器方法
- 架构底层用,获得的路径从src开始,动态接收数据
public static ClassLoader getSystemClassLoader() 获取系统类加载器
例: ClassLoader sc = ClassLoader.getSystemClassLoader();
public InputStream getResourceAsStream(String name) 加载某一个资源文件
例: InputStream is = sc.getResourceAsStream("prop.properties")
反射
概述:
- 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意属性和方法;
- 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
获取Class类对象的三种方式
- Class.forName(全类名)方法
- 类名.class属性
- 对象名.getClass()方法
//1, Class.forName(全类名)方法
Class clazz = Class.forName("com.suihao.study.Student");
//2.通过class属性来获取
Class clazz2 = Student.class;
//3.利用对象的getClass方法来获取class对象
//getClass方法是定义在Object类中
Student s = new Student();
Class clazz3 = s.getClass();
反射获取构造方法并使用
步骤:
- 获取class对象
- 获取构造方法对象(Constructor对象)
- 创建对象
Class类 获取构造方法对象 的方法
1 .Constructor<?>[] getConstructors() 返回所有公共构造方法对象的数组
例:Constructor[] constructors = clazz.getConstructors();
2. Constructor<?>[] getDeclaredConstructors() 返回所有构造方法对象的数组
例:Constructor[] constructors = clazz.getDeclaredConstructors();
3. Constructor<T> getConstructor(Class<?>... parameterTypes) 返回单个公共构造方法对象 (常用,公共方法构造的获取)
例:Constructor constructor1 = clazz.getConstructor(); //public com.suihao.study.day17_1.Student()
Constructor constructor2 = clazz.getConstructor(String.class, int.class); //public com.suihao.study.day17_1.Student(java.lang.String,int)
Constructor constructor3 = clazz.getConstructor(int.class); //Student类中,没有只有int的构造,会报错.
4. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象(常用,私有方法构造的获取)
例:Constructor constructor = clazz.getDeclaredConstructor(String.class);
//private com.suihao.study.day17_1.Student(java.lang.String)
Constructor类用于 创建对象 的方法
1.T newInstance(Object...initargs) 根据指定的构造方法创建对象
2.setAccessible(boolean flag) 设置为true,表示取消访问检查 (创建 私有构造方法对象 时用)
1.创建 公共无参构造方法 对象
方法1:
//1.获取class对象
Class clazz = Class.forName("com.suihao.myreflect3.Student");
//2.获取构造方法对象
Constructor constructor = clazz.getConstructor();
//3.利用空参来创建Student的对象
Student student = (Student) constructor.newInstance();
方法2(已过时):
//简写格式
//1.获取class对象
Class clazz = Class.forName("com.suihao.myreflect3.Student");
//2.在Class类中,有一个newInstance方法,可以利用空参直接创建一个对象
Student student = (Student) clazz.newInstance();//这个方法现在已经过时了,了解一下
2.创建 公共带参构造方法 对象
//1.获取class对象
Class clazz = Class.forName("com.suihao.myreflect3.Student");
//2.获取构造方法对象
Constructor constructor = clazz.getConstructor(String.class, int.class)
//3.利用newInstance创建Student的对象
Student student = (Student) constructor.newInstance("zhangsan", 23);
3.创建 私有的构造方法 对象
//1.获取class对象
Class clazz = Class.forName("com.suihao.myreflect3.Student");
//2.获取一个私有化的构造方法
Constructor constructor = clazz.getDeclaredConstructor(String.class);
//被private修饰的成员,不能直接使用的
//如果用反射强行获取并使用,需要临时取消访问检查
constructor.setAccessible(true);
//3.直接创建对象
Student student = (Student) constructor.newInstance("zhangsan");
反射获取成员变量并使用
步骤:
- 获取class对象
- 获取成员变量对象(Field对象)
- 赋值或获取值
Class类 获取成员变量对象 的方法
1. Field[] getFields() 返回所有公共成员变量对象的数组
例: Field[] fields = clazz.getFields();
2. Field[] getDeclaredFields() 返回所有成员变量对象的数组
例: Field[] fields = clazz.getDeclaredFields();
3. Field getField(String name) 返回单个公共成员变量对象 (常用,公共成员变量对象的获取)
例: Field field = clazz.getField("name");
4. Field getDeclaredField(String name) 返回单个成员变量对象 (常用,私有成员变量的获取)
例: Field field = clazz.getDeclaredField("money")
Field类用于给成员变量赋值的方法
void set(Object obj, Object value) 赋值
Object get(Object obj) 获取值
给 公共成员变量 赋值和取值
//1.获取class对象
Class clazz = Class.forName("com.suihao.myreflect4.Student");
//2.获取name这个Field对象
Field field = clazz.getField("name");
//3.利用set方法进行赋值
//3.1先创建一个Student对象
Student stu = (Student) clazz.newInstance();
//3.2有了对象才可以给指定对象进行赋值
field.set(stu,"zhangsan");
//4.用get方法取值
Object o = filed.get(stu);
System.out.println(o) //zhangsan
给 私有成员变量 赋值和取值
//1.获取class对象
Class clazz = Class.forName("com.suihao.myreflect4.Student");
//2.获取成员变量Field的对象
Field field = clazz.getDeclaredField("money");
//3.取消一下访问检查
field.setAccessible(true);
//4.利用set方法进行赋值
//4.1先创建一个Student对象
Student stu = (Student) clazz.newInstance();
//4.2有了对象才可以给指定对象进行赋值
field.set(stu,"200");
//5.调用get方法来获取值
Object o = field.get(student);
//5.打印一下
System.out.println(o); //200