1、什么是反射
反射的核心是在程序运行时动态的加载类并获取类的信息
一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。而反射则是一开始并不知道我要初始化的类对象是什么
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
反射的实现
1、class.forName(“全类名”):将字节码文件加载进内存,然后返回给class对象
2、类名.class:通过类名获取class对象-----》一般知道类名称才使用
3、对象.getClass:运行时阶段---------》当成参数传递
getFields只能获取到public修饰的方法
1、Declared
2、成员变量如何获取值get(Object)
3.成员变量如何设置值set(Object,值)
4、如何执行方法invoke(Object,参数值)
5、获取构造函数------》根据参数来获取指定的构造函数
6、如何构建对象newInstance(参数)
2、反射能做什么?
我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!
得到 Class 的三种方式
//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
2 // 类型的对象,而我不知道你具体是什么类,用这种方法
3 Person p1 = new Person();
4 Class c1 = p1.getClass();
5
6 //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高
7 // 这说明任何一个类都有一个隐含的静态成员变量 class
8 Class c2 = Person.class;
9
10 //3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
11 // 但可能抛出 ClassNotFoundException 异常
12 Class c3 = Class.forName("com.ys.reflex.Person");