一,类的加载 当程序要使用某一个类时,如果该类还没有进入到内存,那么系统会通过加载,连接,初始化 加载:将类的class文件读取到内存中,并为它创建一个 Class 对象,任何类被
一,类的加载
当程序要使用某一个类时,如果该类还没有进入到内存,那么系统会通过加载,连接,初始化
加载:将类的class文件读取到内存中,并为它创建一个 Class 对象,任何类被加载后都会创建唯一的一个 Class 对象连接:校验类的内部结构是否正确;为静态成员分配内存。初始化:创建对象
二,类加载器
类加载器负责将 .class 文件加载到内存中,并为它生成对应的 Class 对象
三,反射
概念:Java的反射机制是指,程序在运行状态下,对于任何一个类,都能知道这个类中的所有属性和方法;对于任何一个对象,都能调用它的任意一个属性和方法。这种动态获取信息以及动态调用属性和方法的功能就称为反射。
注:要剖析一个类的内部结构,必须先得到这个类的字节码文件对象
四,字节码文件对象的获取
通过对象获取通过类名获取通过 Class 类中的静态方法获取
Person p = new Person();
Class c1 = p.getClass();
System.out.println(c1);
System.out.println("-------------------------------");
Class c2 = Person.class;
System.out.println(c2);
System.out.println("-------------------------------");
Class c3 = Class.forName("com.qf.test1.Person");
System.out.println(c3);
五,通过反射获取构造方法,并创建对象
通过 Class 对象可以调用以下方法获取构造器对象:
getConstructors():返回非私有的构造函数对象组成的数组getDeclaredConstructors():返回所有构造函数对象组成的数组(包括私有的)getConstructor(Class…c):获取非私有的指定参数的构造函数对象getDeclaredConstructor(Class…c):获取指定参数的构造函数对象(包括私有的)通过构造器对象可以创建对象:
newInstance(Object… o):根据指定构造器的参数传入实参创建该类对象setAccessible(boolean b):暴力反射,取消私有化,不建议使用,因为破坏了封装性注:Class 中也有 newInstance() 方法来创建该类对象,但是只能通过默认的构造函数来创建对象
六,通过反射获取成员变量,并赋值
通过 Class 对象可以调用以下方法获取属性对象:
getFields():返回非私有的属性对象组成的数组getDeclaredFields():返回所有属性对象组成的数组(包括私有的)getField(String name):通过属性名获取非私有的指定参数的属性对象getDeclaredField(String name):通过属性名获取指定参数的属性对象(包括私有的)通过属性对象可以为指定对象的该属性赋值:
set(Object obj,Object value)setAccessible(boolean b)
七,通过反射获取成员方法,并调用
通过 Class 对象可以调用以下方法获取方法对象:
getMethods():返回非私有的方法对象组成的数组(包括继承下来的)getDeclaredMethods():返回所有方法对象组成的数组(包括私有的,不包括继承下来的)getMethod(String name, Class…c):通过方法名和参数列表获取非私有的指定参数的方法对象getDeclaredMethod(String name, Class…c):通过方法名和参数列表获取指定参数的方法对象(包括私有的)通过方法对象调用 invoke() 来执行该功能:
invoke(Object obj, Object…o)setAccessible(boolean b)