• 中文
    • English
  • 注册
  • 查看作者
  • Java反射(完)类加载和反射获取信息

    三.类加载

    1.动态加载和静态加载

    • 基本说明

    • 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载1.静态加载:编译时加载相关的类,如果没有则报错,依赖性太强2.动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性3.举例说明

    • 类加载时机

    • 1.当创建对象时(new))2.当子类被加载时3.调用类中的静态成员时4.通过反射Class.forName(“com.test.Cat”);

    2.类加载流程图

    Java反射(完)类加载和反射获取信息

    Java反射(完)类加载和反射获取信息

    • 类加载各阶段完成任务

    • Java反射(完)类加载和反射获取信息

    3.类加载的五个阶段

    3.1加载阶段

    • JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件、也可能是jar包,甚至网络)转化为 二进制字节流加载到内存中 ,并生成一个代表该类的java.lang.Class对象

    3.2连接阶段

    3.2.1验证

    1.目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。2.包括:文件格式验证(是否以魔数oxcafebabe开头)、元数据验证、字节码验证和符号引用验证3.可以考虑使用-Xverify:none参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间。

    3.2.2准备

    JVM会在该阶段对静态变量,分配内存并初始化(对应数据类型的默认初始值如0、0L、null、false等)。这些变量所使用的内存都将在方法区中进行分配

    3.2.3解析

    虚拟机将常量池内的符号引用替换为直接引用的过程。

    3.3初始化

    • Initialization(初始化)

    • 1.到初始化阶段,才真正开始执行类中定义的Java程序代码,此阶段是执行()方法的过程。2.()方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有 静态变量 的赋值动作和静态代码块中的语句,并进行合并。3.虚拟机会保证一个类的()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的()方法,其他线程都需要阻塞等待,直到活动饯程执行()方法完毕[ debug源码 ]

    四.反射获取类的结构信息

    1.第一组:java.lang.Class类

    2.第二组:java.lang.reflect.Field类

    3.第三组:java.lang.reflect.Method类

    4.第四组:java.lang.reflect.Constructor类

    五.通过反射创建对象

    1.方式一:调用类中的oublic修饰的无参构造器2.方式二:调用类中的指定构造器

    3.Class类相关方法

    • newInstance:调用类中的无参构造器,获取对应类的对象

    • getConstructor(Class…clazz):根据参数列表,获取对应的public构造器对象

    • getDecalaredConstructor((Class…clazz):根据参数列表,获取对应的所有构造器对象

    4.Constructor类相关方法

    • setAccessible:暴破

    • newlnstance(Object…obj):调用构造器

    5.1通过反射访问类中的成员

    • 访问属性

    1.根据属性名获取Field对象

    Field f=clazz对象.getDeclaredField(属性名):

    2.暴破:f.setAccessible(true);//f是Field

    3.访问

    f.set(o,值);syso(f.get(o));

    4.如果是静态属性,则set和get中的参数o,可以写成null

    • 访问方法

    1.根据方法名和参数列表获取Method方法对象:Method m=clazz.getMethod(方法名,XX.class);

    2.获取对象:Object o=clazz.newInstance();

    3.暴破:m.setAccessible(true):

    4.访问:Object returnValue=m.invoke(o,实参列表)://o就是对象

    5.注意:如果是静态方法,则invoke的参数o,可以写成null!

  • 0
  • 0
  • 0
  • 40
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: