龙空技术网

百万年薪大佬,一文全面解析Java反射及动态代理模式,网友:牛批

软件测试大熊 20

前言:

而今你们对“javaexe程序是用来解析 文件的”大致比较珍视,各位老铁们都想要了解一些“javaexe程序是用来解析 文件的”的相关知识。那么小编在网上汇集了一些有关“javaexe程序是用来解析 文件的””的相关内容,希望姐妹们能喜欢,小伙伴们快快来了解一下吧!

一、反射概述

  1、什么是反射:

    Reflection是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API获得任何类的内部信息,并能直接操作任意对象的内部属性和方法。

    加载完类之后,在堆内存的方法区中,就产生了一个class类型的对象(一个类只有一个Class对象),这个对象包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象地称之为:反射。

  2、反射的使用方式:

3、什么时候使用反射?

    当需要动态创建对象的时候使用反射。

    反射的特性:动态性。

  4、反射和面向对象中的封装性是否矛盾?

    不矛盾。举个例子,比如一个类中提供了私有构造器,和一个返回该类实例的方法,可以通过暴露出的方法创建对象,如果非要使用构造器创建对象则需要用到反射。换句话说,不建议你用构造器创建,如果你非要用也不是不行,可以利用反射调用。

二、关于java.lang.Class的理解

  1、类的加载过程

    程序通过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程就叫做类的加载。加载到内存中的类就称为运行时类,此运行时类,就作为一个Class的一个实例。换句话说,Class的一个实例就对应着一个运行时类。

  2、加载到内存中的运行时类,会缓存一段时间。在此时间内,我们可以通过不同的方式来获取来获取此运行时类。

  3、获取Class的实例的方式

三、类的加载过程

  1、加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址)。所有需要访问和使用类数据的操作只能通过这个Class对象。这个加载的过程需要类加载器参与。

  2、连接:将Java类的二进制代码合并到JVM的运行状态中的过程。

    2.1、验证:确保加载的类信息符合JVM规范。

    2.2、准备:正式为类变量(static)分配内存并设置变量默认初始值的阶段,这些内存都将在方法区进行分配。

    2.3、解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。

  3、初始化;

    3.1、执行类构造器<clinit>( )方法的过程。类构造器<clinit>( )方法是由编译器自动收集类中所有变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,而非构造该类对象的构造器)。

    3.2、当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。

    3.3、虚拟机会保证一个类的<clinit>( )方法在多线程环境中被正确加锁和同步。

四、类加载器的理解

  1、类加载器的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

  2、类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过JVM垃圾回收机制可以回收这些Class对象。

  3、JVM规范定义了如下类型的类的加载器

    3.1、引导类加载器:用C++编写的,是JVM自带的类加载器,负责Java平台核心库,用来装载核心类库。该加载器无法直接获取。

    3.2、扩展类加载器:负责jre、lib、ext目录下的jar包或者 -D java.ext.dirs指定目录下的jar包装入工作库。

    3.3、系统类加载器:负责 java -classpath 或D -java.class.path所指目录下的类与jar包装入工作,是最常用的加载器。

 4、类加载器读取配置文件

五、通过反射创建对应的运行时类的对象六、获取运行时类的完整结构七、调用运行时类的指定结构八、反射的应用:动态代理

  1、代理设计模式的原理:

    使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。

  2、静态代理

  3、动态代理

标签: #javaexe程序是用来解析 文件的