反射

反射

反射给人的感觉总是你知道有那么个东西,但就是想不起来用,具体用的时候又不是很清楚怎么用。下面有一些我对反射的自我理解吧。

概念:

将类的各个组成部分封装为其他对象,这就是反射机制。
理解:就比如说定义了一个学生类,由成员变量,构造方法,成员方法三部分构成,将这三部分封装成对象.而这个类经过编译后会生成一个字节码文件,这个文件中就存储着这三部分对象.java面向对象的语言,这样我们就可以对对象进行操作.

反射的优点:(建议结合实例理解)

  1. 可以在程序运行过程中,操作这些对象。
  2. 可以解耦,提高程序的可扩展性。
    反射

如何获取这些字节码文件?

这里有三种方式:

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);

个人的一些理解,深层次和不对的地方还望大神们多多指点.