一、反射概述
当一个Java文件编译之后会生成.class文件(字节码文件), 当这个字节码文件加载到内存时,会在内存的【代码区】运行, 这个字节码文件,包含了所有的当前对应类的内容, Java中的反射机制就是根据字节码文件,创建一个Class类对象,通过Class类对象获取在字节码文件中的内容。
反射就是把Java类中的各种成分映射成一个个的Java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
Class对象中,包含当前字节码文件的所有的成员变量(Field), 成员方法(Method),构造方法(Constructor), 前提是, 要调取的类必须是public修饰
反射常用的类
- Class类—可获取类和类的成员信息
- Field类—可访问类的属性
- Method类—可调用类的方法
- Constructor类—可调用类的构造方法
基本步骤
- 导入java.lang.reflect.*
- 获得需要操作的类的Java.lang.Class对象
- 调用Class的方法获取Field、Method等对象
- 使用反射API进行操作(设置属性﹑调用方法)
二、获取对象的方法
优先使用【包名+类名】,其次是通过类型获取类对象,最后再考虑通过具体实例获取不定类对象。
//通过类型获取类对象,使用Class属性获取【该方式获取的额是准确的Class类对象】
Class<Person> cls = Person.class;
//使用getClass()方法获取【该方式获取的是不定Class类对象,需要后面通过getType获取具体类型】
Person person = new Person();
Class<? extends Person> cls = person.getClass();
//使用“完整的包名.类名”获取【最常用获取方式】
Class<?> cls = Class.forName("reflection.demo.Person");
//获取父类
Class<?> supercls = cls.getSuperclass();
//获取父类泛型
Type type