13、反射和类加载

1、反射

定义:Refiection是被视为动态语言的关键,反射机制允许程序在运行期间借助Reflection API取得任何类的内部信息,并能直接操作*任意对象内部属性及方法*

2、反射机制作用
  • 对于任意一个类,都能够知道这个类的所有属性和方法。

  • 对于任意一个对象,都能调用它的任意一个方法和属性。

这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

核心:类加载的时候在堆空间创建的字节码对象(Class类对象),包含了一个运行时信息。

3、反射核心类
Class 类 表示一个类的运行时信息,可获取类的构造函数,方法,属性等信息。可以使用Class.forName()方法获取类的Class对象,也可以通过对象的getClass() 方法获取其对应的Class 对象。
Constructor 类 表示一个类的构造函数。通过Constructor 类可以创建类的实例。可以使用Class 对象的getConstructors() 或getConstructor() 方法获取构造函数的对象。
Method 类 表示一个类的方法。通过Method 类可以调用类的方法。可以使用Class 对象的getMethods() 或getMethod() 方法获取方法的对象。
Field 类 表示一个类的字段。通过Field 类可以访问和修改类的字段的值。可以使用Class 对象的getFields() 或getField() 方法获取字段的对象。

4、获取Class 对象方式

如果要用反射机制,则必须先获取类的字节码对象

  • 使用类字面常量: 类名.class

  • Object类中方法: 对象.getClass()

  • public final native Class getClass();

  • 借助Class类中方法:Class.forName("类的全包名")

  • public static Class forName(String className);

  • 调用运行时类的静态属性:类名.class

    Class cla = User.class;
  • 调用运行时类的对象的getClass()

    User u1 = new User();
    Class cla1 = u1.getClass();
  • 调用Class的静态方法forName(String className)

    String className = "全类名";
    Class cla3 = Class.forName(className);
    ​
    ​
    System.out.println(cla == cla1);true
    System.out.println(cla1 == cla3);true
  • 使用类加载器的方式

    Class cla3 = ClassLoader.getSystemClassLoder().loadClass("全类名");
    System.out.println(cla == cla3);true

    Class的实例都

其他类型字节码对象获取

基本数据类型获取字节码对象固定格式: 数据类型.class

数组类型获取格式: 数据类型[].class; 数组名.getClass();

注意事项:一个类的字节码对象,有且只有一个!

5、通过反射获取类的构造方法

通过反射可以获取类的构造方法(含private)对象,并借助其实例化对象。

方法名 说明
Constructor[] getConstructors() 返回所有public构造方法对象的数组
Constructor[] getDeclaredConstructors() 返回所有构造方法(含private)对象的数组
Constructor getConstructor(Class...parameterTypes) 返回指定public构造方法对象
Constructor getDeclaredConstructor(Class parameterTypes) 返回指定构造方法(含private)对象

2)Constructor类创建对象方法

方法名 说明
T newInstance(Object...initargs) 根据指定的构造方法创建对象
setAccessible(boolean flag) 设置为true,表示取消访问检查
6、通过反射获取成员变量
方法名 说明
Field[] getFields() 返回所有公共成员变量对象的数组(含继承的)
Field[] getDeclaredFields() 返回所有成员变量对象的数组(含private,但不包括继承的)
Field getField(String name) 返回单个公共成员变量对象(含继承的)
Field getDeclaredField(String name) 返回单个成员变量对象(含private,不包括继承的)

2)属性获取及设置方法

方法名 说明
void set(Object obj, Object value) 赋值
Object get(Object obj) 获取值
7、获取成员方法

通过反射可以获取类里面所有的成员(含私有)方法,并调用。

1)Method获取相关方法

方法名 说明
Method[] getMethods() 返回所有公共成员方法对象的数组(包含继承的)
Method[] getDeclaredMethods() 返回所有成员方法对象的数组(含private,不含继承)
Method getMethod(String name,Class...paramterTypes) 返回单个公共成员方法对象(包含继承的)
Method getDeclaredMethod(String name,Class... parameterTypes) 返回单个成员方法对象(含private,不含继承)

2)Method对象调用方法

方法名 说明
Object invoke(Object obj, Object... args) 运行方法

参数一:用obj对象调用该方法 参数二:调用方法的传递的参数(如果没有就不写) 返回值:方法的返回值(如果没有就不写)

8、类的加载过程

类加载的过程:加载、验证、准备、解析、初始化

13、反射和类加载_第1张图片

9、加载器分类

13、反射和类加载_第2张图片

  • Bootstrap ClassLoader 根类加载器

    也被称为引导类加载器,通常表示为null 。

    它是Java虚拟机的一部分,负责加载Java核心类库,比如rt.jar 等,

    根加载器是所有类加载器的顶级加载器,它不是一个Java对象,而是由JVM实现的一部分。

    类一般存在%JAVA_HOME%\jre\lib\rt.jar 中

  • Extension ClassLoader 扩展类加载器

    负责加载Java的扩展类库,也可以通过java.ext.dirs 系统属性来指定扩展类库的路径

  • System ClassLoader 系统类加载器

它负责加载应用程序的类,包括用户自定义的类和第三方库等。它是大多数Java应用程序默认的类加载器。

  • User ClassLoader 自定义类加载器

你可能感兴趣的:(Java编程,java,javascript,jvm)