类的加载和反射

一、类的加载

  类的加载一共分为三步:

  1、加载

      就是将类加载进内存,并同时创建一个Class对象(就是描述一个 .class 文件的对象)
      而且任何类被使用前都会先创建一个 Class对象

  2、连接

      验证 是否有正确的内部结构,并和其他类协调一致
      准备 负责为类的静态成员分配内存,并设置默认初始化值
      解析 将类的二进制数据中的符号引用替换为直接引用

  3、初始化

      见前面的初始化笔记。

    初始化的时机:

        创建类的实例
        访问类的静态变量,或者为静态变量赋值
        调用类的静态方法
        使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
        初始化某个类的子类
        直接使用java.exe命令来运行某个主类

二、类的加载器

  类加载器
    负责将.class文件加载到内在中,并为之生成对应的Class对象。

  类加载器的组成

    1、Bootstrap ClassLoader 根类加载器

        也被称为引导类加载器,负责Java核心类的加载
      比如: System,String等。在JDK中JRE的lib目录下rt.jar文件中

    2、Extension ClassLoader 扩展类加载器

        负责JRE的扩展目录中jar包的加载。
      在JDK中JRE的lib目录下ext目录

    3、Sysetm ClassLoader 系统类加载器

        负责在JVM启动时加载来自java命令的class文件,
        以及classpath环境变量所指定的jar包和类路径
      (一般此加载器加载的就是我们所写的文件)

三、反射

  概念:
      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
      对于任意一个对象,都能够调用它的任意一个方法和属性;
      这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    就是通过一定的方法(如:通过 .class文件的文件名)来指向一个 .class文件,在获得一个用来
    描述这个 .class文件的 Class 对象,

    之后通过该Class对象来获取文件中的 构造方法、成员变量、成员方法, (既可以批量获取,
    也可以单个获取,既可以获取public 类型的,也可获取private类型的, 甚至可以通过暴力访问的方法
    来访问 private的成员。)

    通过获取到的构造方法,可以得到一个Object型的该类对象,(Constructer)
    通过获取到的成员 和 该类对象,可以操作.class文件中的成员了。(Field, Method)

  获取Class对象:
          1、Object的 getClass 方法。
          2、数据类型的静态属性 class (引用类型、基本类型)。
          3、Class类中的静态方法。
              static Class<?> forName(String className)
              static Class<?> forName(String name, boolean initialize, ClassLoader loader)

  获取构造方法:

        获取构造方法
          getConstructors(Class<?>... parameterTypes)
          getDeclaredConstructors()
        创建对象
          newInstance()
          con.newInstance(“zhangsan", 20);

        获取成员变量:
            获取所有成员
                  getFields,
                  getDeclaredFields
            获取单个成员
                  getField,
                  getDeclaredField
            修改成员的值
                  set(Object obj,Object value)
                  将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

        获取成员方法:
            获取所有方法
                  getMethods
                  getDeclaredMethods
            获取单个方法
                  getMethod
                  getDeclaredMethod
            暴力访问
                  method.setAccessible(true);

四、动态代理

    动态代理:   在程序运行过程中产生的这个对象
            而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,
          所以,动态代理其实就是通过反射来生成一个代理

      就是说,我们需要对一个我们已有的对象的方法添加一些新的功能,而这些功能对每个对象、
      每个方法都是相同的, 那么我们就可以使用动态代理来获得一个该对象的动态代理对象,
      使用该对象再调用的方法,就是被动态代理过后的方法。

    在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,
    通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。
    我们有更强大的代理cglib

    Proxy类中的方法创建动态代理类对象
      public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

    最终会调用InvocationHandler的方法
        InvocationHandler
        Object invoke(Object proxy,Method method,Object[] args)

时间: 2024-10-05 16:38:12

类的加载和反射的相关文章

类的加载到反射reflect

类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化这三个步骤来实现对这个类进行初始化. 加载: 就是指将class文件加载进入内存,并为之创建一个Class对象 任何类被使用时,系统都会创建一个Class对象 连接: 验证: 是否有正确的内部结构,并且和其他类协调一致 准备: 负责为类的静态成员分配内存,并设置默认初始化值 解析: 将类的二进制数据中的符号引用替换为直接引用 初始化:就是以前我们讲过的初始化步骤 类初始化的时机: 创建类的实例 访问类的静

java 类的加载及反射机制

一,类的加载,连接,初始化 一个类被加载到JVM需要三个步骤:加载,链接,初始化 1,先说下加载过程 2,连接 注意连接过程分为三个阶段,验证,准备,解析 3,初始化 这里注意:类的加载过程,先加载静态代码块,其次是代码块,然后是构造函数 静态成员之间级别一样,因此谁在前,谁最先被加载 二,反射机制 1,先理解下反射 2,为什么要使用反射 可能以上叙述依然很抽象,下面我们用具题代码说明 在开始代码之前我们要先,明白一个对象 java.lang.Class 我们可以这样想,java程序在运行前,会

Java 学习 类的加载及反射

类加载机制与反射 (一)类的加载,连接和初始化 1,一个main函数相当于调用一个jvm进程,main函数结束其内存数据清除 2,类加载(类初始化)三个步骤:   1:类的加载: 2,类的连接: 3,类的初始化:                     (二)类加载器 1,Bootstrap ClassLoader:根类加载器(非ClassLoder子类,jvm提供) 2,Extension ClassLoader:扩展类加载器 负责加载JRE中的类 3,System ClassLoader:系

黑马程序员————java中类的加载、反射、动态代理、枚举

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 类的加载.反射.动态代理.枚举 一.类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.加载: 就是指将class文件读入内存,并为之创建一个Class对象 ★★

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

java 27 - 1 反射之 类的加载器

说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象. 连接: 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 初始化: 就是我们以前讲过的初始化步骤 类初始化时机: 创建类的实

类的加载机制和反射——一、类的加载、连接和初始化

类的加载.连接和初始化 1.JVM和类 (1)当调用java命令运行某个Java程序时,该命令会启动一个Java虚拟机进程,不管该Java程序有多么复杂,该程序启动了多少线程,他们都处于该Java虚拟机进程里. (2)同一个JVM的所有线程.所有变量都处于同一个进程里,他们都使用该JVM进程的内存区. 下面的ATast1和ATest2的输出结果分别是7和6,因为这两个不是位于同一个JVM中的. public class A { //定义该类的类变量 public static int a = 6

类的加载、时机、反射、模板设计、jdk7/jdk8新特性(二十六)

1.类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. * 加载 * 就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. * 连接 * 验证 是否有正确的内部结构,并和其他类协调一致 * 准备 负责为类的静态成员分配内存,并设置默认初始化值 * 解析 将类的二进制数据中的符号引用替换为直接引用 * 初始化 就是我们以前讲过的初始化

类的加载器和反射

类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化.  加载 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象   连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 类的初始化时机 1. 创建类的实例 2. 类的静态变量,或者为静态变量赋值 3. 类的静态方法 4