• 类加载器 反射


     类的加载

    当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

    加载

    就是指将class文件读入内存,并为之创建一个Class对象。

    任何类被使用时系统都会建立一个Class对象

    l 连接

    验证 是否有正确的内部结构,并和其他类协调一致

    准备 负责为类的静态成员分配内存,并设置默认初始化值

    解析 将类的二进制数据中的符号引用替换为直接引用

    初始化

    就是我们以前讲过的初始化步骤

    类初始化时机

    1. 创建类的实例

    2. 类的静态变量,或者为静态变量赋值

    3. 类的静态方法

    4. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

    5. 初始化某个类的子类

    6. 直接使用java.exe命令来运行某个主类

     

    反射

    获取Class对象

    通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。

     

    通过反射获取构造方法并使用

    构造方法使用类Constructor表示

     

    返回一个构造方法

    public Constructor<T> getConstructor(Class<?>... parameterTypes) 获取public修饰, 指定参数类型所对应的构造方法

    public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定参数类型所对应的构造方法(包含私有的)

    返回多个构造方法

    public Constructor<?>[] getConstructors() 获取所有的public 修饰的构造方法

    public Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(包含私有的)

     

     

     

     通过反射方式,获取构造方法,创建对象

    获取构造方法,步骤如下:

    1. 获取到Class对象

    2. 获取指定的构造方法

    3. 通过构造方法类Constructor中的方法,创建对象

    public T newInstance(Object... initargs)

     

     通过反射获取成员变量并使用

    在反射机制中,把类中的成员变量使用类Field表示。可通过Class类中提供的方法获取成员变量:

    返回一个成员变量

    public Field getField(String name) 获取指定的 public修饰的变量

    public Field getDeclaredField(String name) 获取指定的任意变量

    返回多个成员变量

    public Field[] getFields() 获取所有public 修饰的变量

    public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)

     

    通过反射获取成员方法并使用

    在反射机制中,把类中的成员方法使用类Method表示。可通过Class类中提供的方法获取成员方法:

    返回获取一个方法:

    public Method getMethod(String name, Class<?>... parameterTypes)

     获取public 修饰的方法

    public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

     获取任意的方法,包含私有的

    参数1: name 要查找的方法名称; 参数2parameterTypes 该方法的参数类型

    返回获取多个方法:

    public Method[] getMethods() 获取本类与父类中所有public 修饰的方法

    public Method[] getDeclaredMethods() 获取本类中所有的方法(包含私有的)

     

    泛型擦除

    程序编译后产生的.class文件中是没有泛型约束的,这种现象我们称为泛型的擦除.

     

    反射配置文件

    通过反射配置文件,运行配置文件中指定类的对应方法

     

    读取配置文件,调用指定类中的对应方法

    获取Class对象的三种方式

    方式: 通过Object类中的getObject()方法

    Person p = new Person();

    Class c = p.getClass();

     

    方式二: 通过 类名.class 获取到字节码文件对象(任意数据类型都具备一个class静态属性,看上去要比第一种方式简单)。

    Class c2 = Person.class;

     

    方式三: 通过Class类中的方法(将类名作为字符串传递给Class类中的静态方法forName即可)。

    Class c3 = Class.forName("Person");

  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/longmingyeyu/p/12797342.html
Copyright © 2020-2023  润新知