1. 一个类在内存中只有一个class对象
2. 一个类被加载之后,类的整个结构都会被封装到class对象中
3. class对象只能由系统创建,且一个加载的类在JVM中只有一个class对象
获取类的class对象的三种方式:
(1)Class.forName("");
(2)Student student = new Student();
Class class = student.getClass();
(3)Class class = Student.class;
4. 类、接口、一维(二维)数组、注解、枚举、基本类型、void
———— 都拥有class对象
5. (1)子类调用父类的一个静态变量,子类本身不会被加载(前提:子类继承了父类)
(2)如果加载类时,发现被加载类有父类,则会先加载父类
(3)初始化数组时,比如Son[] sons = new Son[9],不会有类被加载;
6. 通过反射获取类的加载器:Class.forName(" ").getClassLoader();
7. 反射可以获取的方法:
(1)class.getName();获取类名
(2)class.getSimpleName();获取简单类名
(3)class.getFields();只能找到所有未public的属性
(4)class.getDeclaredFields();获取全部属性
(5)class.getMethods();获取本类及父类的所有public方法
(6)class.getDeclaredMethods();获取本类的所有方法
(7)class.getMethod();获取特定的某个方法
(8)class.getConstructors();获取本类中所有的public构造方法
(9)class.getDeclaredConstructors();获取本类中所有的public/private构造方法
8. 通过反射创建类的对象:
class.newInstance(); —— 动态创建一个对象,默认调用无参构造器
9. 通过反射修改方法:
(1)通过反射获取一个类的对象:
Class class = Class.forName("");
User user = class.newInstance();
(2)指定获取其中的一个构造方法:
Method method = class.getDeclaredMethod("");
method.invoke(user, "构造器参数");
10. 通过反射修改类的属性(private)
(1)通过反射获取一个对象;
(2)通过反射获取属性Field;
(3)Field需要开启权限setAccessiable(true);
(4)field.set(对象,修改后的值);
11. 性能分析:反射调用比一般的对象方法调用耗时更长!
普通方法调用:9ms
反射方法调用:5699ms
关闭检测后的反射调用:1959ms
12. 反射获取泛型信息:getGenericParameter();获取泛型参数类型;
getAuthoticParameter(); 获取真实类型;