文章目录
-
- 1. 什么是反射?
- 2. 反射的起源?
- 3. 反射的作用?
- 4. 反射常见问题?
1. 什么是反射?
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
2. 反射的起源?
一切反射相关的代码都从获得类对象开始
//3.1 Class.forName(完整类名 或者 "类的全路径")
// 例:Class clz=Class.forName("com.wangyiying.Aservlet");
// Aservlet a=clz.newInstance();
//3.2 类名.class
// 例:Student,class或者AServlet.class
//3.3 对象.getClass()
// 例: Student stu=new Student();
// Class clz=stu.getClass();
3. 反射的作用?
作用:
(一)实例化对象
Student stu=new Student();
Class clz=stu.getClass();
(二)动态调用方法
Class clz=Student.class;
Method m=clz.getDeclaredMethod("add",Integer.class,Integer.class);
m.setAccessible(true);
Object invoke = m.invoke(clz.newInstance(),20,5);
System.out.println(invoke);
(三)读写属性
(1)读
Student stu=new Student("s001","zs");
stu.age=31;
Class clz=stu.getClass();
// 获取属性值
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getName()+":"+field.get(stu));
}
(二)写
Student stu=new Student("s001","zs");
stu.age=31;
Class clz=stu.getClass();
// 设置属性值(共有的)
// Field field = clz.getDeclaredField("age");
// field.set(stu, 45);
// System.out.println(stu.age);
Field field = clz.getDeclaredField("sname");
field.setAccessible(true);
field.set(stu, "ls");
System.out.println(stu.getSname());
4. 反射常见问题?
(一)封装后的类,内部的属性一定不能够被外界访问吗?
不是,可以被外部访问
(二)内部私有化的方法一定不能被外界调用吗?
不是,可以被外部调用
Person p=new Person("001","zs",33);
Field[] fields = p.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getName()+" , "+field.get(p));
}
(三)getConstructor 与 getDeclaredConstructor的区别?
getConstructor获取的是public修饰
getDeclaredConstructor 获取的所有的构造器