网站首页 > java教程 正文
一、反射概述
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、动态代理
猜你喜欢
- 2024-10-24 Java动态代理与静态代理以及它能为我们做什么
- 2024-10-24 Java 设计模式 之 代理模式 (1)(java设计模式之代理模式)
- 2024-10-24 Java设计模式:代理模式 vs. 装饰模式
- 2024-10-24 设计模式篇——代理模式详解(面试再问你代理模式,这么回答他)
- 2024-10-24 动态代理大揭秘,带你彻底弄清楚动态代理
- 2024-10-24 面试:Java的代理模式动态代理和静态代理区别,aop用的什么代理
- 2024-10-24 Java设计模式之代理模式(java代理类是什么)
- 2024-10-24 JAVA设计模式——代理模式(java编写代理服务)
- 2024-10-24 23种java设计模式之:门面模式、享元模式、代理模式
- 2024-10-24 Java 17中的动态代理:实现灵活的代理模式
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)