反射
反射
反射给人的感觉总是你知道有那么个东西,但就是想不起来用,具体用的时候又不是很清楚怎么用。下面有一些我对反射的自我理解吧。
概念:
将类的各个组成部分封装为其他对象,这就是反射机制。
理解:就比如说定义了一个学生类,由成员变量,构造方法,成员方法三部分构成,将这三部分封装成对象.而这个类经过编译后会生成一个字节码文件,这个文件中就存储着这三部分对象.java面向对象的语言,这样我们就可以对对象进行操作.
反射的优点:(建议结合实例理解)
- 可以在程序运行过程中,操作这些对象。
- 可以解耦,提高程序的可扩展性。
如何获取这些字节码文件?
这里有三种方式:
1.Class.forName(“全类名”)
2.类名.class
3.对象.getClass()
获取这个字节码文件后,就可以获取它的成员变量们,构造方法们,成员方法们,(因为不只是一个,可能是多了)
获取成员变量们
可以做什么?
获取到成员变量后,可以通过get,set方法,给其赋值
举例:
//获取私有成员变量
Field name = cls.getDeclaredField(“name”);
//创建一个对象
Student stu = new Student();
//忽略访问权限修饰符的安全检查
name.setAccessible(true);
//给对象设置值
name.set(stu, “科比”);
//获取对象的值
name.get(stu);
获取构造方法们
(方法其实大同小异,都可以参照获取成员变量的方法理解)
可以做什么?
获取构造方法后,就是为了创建对象,可以通过newInstance()创建对象
举例:
//获取有参构造方法
Constructor constructor = cls.getConstructor(String.class, int.class);
//创建对象
Student stu = constructor.newInstance(“科比”, 41);
获取成员方法们
可以做什么?
获取这些方法,就是为了执行方法.
举例:
//获取方法
Method method = cls.getMethod(“study”);
//执行方法
method.invoke(stu);
个人的一些理解,深层次和不对的地方还望大神们多多指点.