JAVA中的反射机制和模块化
目录
一.类加载
1.1类加载描述
1.2类的加载
1.3类的连接
1.4类的初始化
1.4.1类初始化的作用
1.4.2初始化步骤
1.4.3类的初始化时机
二.反射
2.1反射的概述
2.2获取Class类对象的三种方式
2.3反射获取构造方法
2.4反射获取成员变量
2.5反射获取成员方法
2.6反射的案例
2.6.1反射练习之越过泛型检查
2.6.2运行配置文件中指定类的指定方法
三.模块化 3.1模块化概述
3.2模块化使用
3.3模块化的基本使用
一.类加载
1.1类加载描述
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化
1.2类的加载
- 就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象
- 任何类被使用时,系统都会为之建立一个 java.lang.Class 对象
1.3类的连接
- 验证阶段:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致
- 准备阶段:负责为类的类变量分配内存,并设置默认初始化值
- 解析阶段:将类的二进制数据中的符号引用替换为直接引用
1.4类的初始化
1.4.1类初始化的作用
在该阶段,主要就是对类变量进行初始化
1.4.2初始化步骤
- 假如类还未被加载和连接,则程序先加载并连接该类
- 假如该类的直接父类还未被初始化,则先初始化其直接父类
- 假如类中有初始化语句,则系统依次执行这些初始化语句
- 注意:在执行第2个步骤的时候,系统对直接父类的初始化步骤也遵循初始化步骤1-3
1.4.3类的初始化时机
- 创建类的实例
- 调用类的类方法
- 访问类或者接口的类变量,或者为该类变量赋值
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
二.反射
2.1反射的概述
是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展
2.2获取Class类对象的三种方式
- 类名.class属性
- 对象名.getClass()方法
- Class.forName(全类名)方法
public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException {//使用类的class属性来获取该类对应的Class对象Class<Student> c1 = Student.class;System.out.println(c1);Class<Student> c2 = Student.class;System.out.println(c1 == c2);System.out.println("--------");//调用对象的getClass()方法,返回该对象所属类对应的Class对象Student s = new Student();Class<? extends Student> c3 = s.getClass();System.out.println(c1 == c3);System.out.println("--------");//使用Class类中的静态方法forName(String className)Class<?> c4 = Class.forName("com.itheima_02.Student");System.out.println(c1 == c4);}
}
2.3反射获取构造方法
方法名 | 说明 |
---|---|
Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor<T> getConstructor(Class<?>... parameterTypes) | 返回单个公共构造方法对象 |
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 返回单个构造方法对象 |
public class ReflectDemo01 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取Class对象Class<?> c = Class.forName("com.itheima_02.Student");//Constructor<?>[] getConstructors() 返回一个包含 Constructor对象的数组, Constructor对象反映了由该 Class对象表示的类的所有公共构造函数
// Constructor<?>[] cons = c.getConstructors();//Constructor<?>[] getDeclaredConstructors() 返回反映由该 Class对象表示的类声明的所有构造函数的 Constructor对象的数组Constructor<?>[] cons = c.getDeclaredConstructors();for(Constructor con : cons) {System.out.println(con);}System.out.println("--------");//Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor对象,该对象反映由该 Class对象表示的类的指定公共构造函数//Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor对象,该对象反映由此 Class对象表示的类或接口的指定构造函数//参数:你要获取的构造方法的参数的个数和数据类型对应的字节码文件对象Constructor<?> con = c.getConstructor();//Constructor提供了一个类的单个构造函数的信息和访问权限//T newInstance(Object... initargs) 使用由此 Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例Object obj = con.newInstance();System.out.println(obj);// Student s = new Student();
// System.out.println(s);}
}
2.4反射获取成员变量
方法名 | 说明 |
---|---|
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
public class ReflectDemo01 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取Class对象Class<?> c = Class.forName("com.itheima_02.Student");//Field[] getFields() 返回一个包含 Field对象的数组, Field对象反映由该 Class对象表示的类或接口的所有可访问的公共字段//Field[] getDeclaredFields() 返回一个 Field对象的数组,反映了由该 Class对象表示的类或接口声明的所有字段
// Field[] fields = c.getFields();Field[] fields = c.getDeclaredFields();for(Field field : fields) {System.out.println(field);}System.out.println("--------");//Field getField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定公共成员字段//Field getDeclaredField(String name) 返回一个 Field对象,该对象反映由该 Class对象表示的类或接口的指定声明字段Field addressField = c.getField("address");//获取无参构造方法创建对象Constructor<?> con = c.getConstructor();Object obj = con.newInstance();// obj.addressField = "西安";//Field提供有关类或接口的单个字段的信息和动态访问//void set(Object obj, Object value) 将指定的对象参数中由此 Field对象表示的字段设置为指定的新值addressField.set(obj,"西安"); //给obj的成员变量addressField赋值为西安System.out.println(obj);// Student s = new Student();
// s.address = "西安";
// System.out.println(s);}
}
2.5反射获取成员方法
方法名 | 说明 |
---|---|
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>... parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>... parameterTypes) | 返回单个成员方法对象 |
public class ReflectDemo01 {public static void main(String[] args) throws Exception {//获取Class对象Class<?> c = Class.forName("com.itheima_02.Student");//Method[] getMethods() 返回一个包含 方法对象的数组, 方法对象反映由该 Class对象表示的类或接口的所有公共方法,包括由类或接口声明的对象以及从超类和超级接口继承的类//Method[] getDeclaredMethods() 返回一个包含 方法对象的数组, 方法对象反映由 Class对象表示的类或接口的所有声明方法,包括public,protected,default(package)访问和私有方法,但不包括继承方法
// Method[] methods = c.getMethods();Method[] methods = c.getDeclaredMethods();for(Method method : methods) {System.out.println(method);}System.out.println("--------");//Method getMethod(String name, Class<?>... parameterTypes) 返回一个 方法对象,该对象反映由该 Class对象表示的类或接口的指定公共成员方法//Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回一个 方法对象,它反映此表示的类或接口的指定声明的方法 Class对象//public void method1()Method m = c.getMethod("method1");//获取无参构造方法创建对象Constructor<?> con = c.getConstructor();Object obj = con.newInstance();
// obj.m();//在类或接口上提供有关单一方法的信息和访问权限//Object invoke(Object obj, Object... args) 在具有指定参数的指定对象上调用此 方法对象表示的基础方法//Object:返回值类型//obj:调用方法的对象//args:方法需要的参数m.invoke(obj);}
}
2.6反射的案例
2.6.1反射练习之越过泛型检查
案例需求
通过反射技术,向一个泛型为Integer的集合中添加一些字符串数据
代码
public class ReflectTest01 {public static void main(String[] args) throws Exception {//创建集合ArrayList<Integer> array = new ArrayList<Integer>();// array.add(10); // array.add(20); // array.add("hello");Class<? extends ArrayList> c = array.getClass();Method m = c.getMethod("add", Object.class);m.invoke(array,"hello");m.invoke(array,"world");m.invoke(array,"java");System.out.println(array);} }
2.6.2运行配置文件中指定类的指定方法
案例需求
通过反射运行配置文件中指定类的指定方法
代码
public class ReflectTest02 {public static void main(String[] args) throws Exception {//加载数据Properties prop = new Properties();FileReader fr = new FileReader("myReflect\\class.txt");prop.load(fr);fr.close();/*className=com.itheima_06.StudentmethodName=study*/String className = prop.getProperty("className");String methodName = prop.getProperty("methodName");//通过反射来使用Class<?> c = Class.forName(className);//com.itheima_06.StudentConstructor<?> con = c.getConstructor();Object obj = con.newInstance();Method m = c.getMethod(methodName);//studym.invoke(obj);} }
三.模块化
3.1模块化概述Java语言随着这些年的发展已经成为了一门影响深远的编程语言,无数平台,系统都采用Java语言编写。但是,伴随着发展,Java也越来越庞大,逐渐发展成为一门“臃肿” 的语言。而且,无论是运行一个大型的软件系统,还是运行一个小的程序,即使程序只需要使用Java的部分核心功能, JVM也要加载整个JRE环境。 为了给Java“瘦身”,让Java实现轻量化,Java 9正式的推出了模块化系统。Java被拆分为N多个模块,并允许Java程序可以根据需要选择加载程序必须的Java模块,这样就可以让Java以轻量化的方式来运行
其实,Java 7的时候已经提出了模块化的概念,但由于其过于复杂,Java 7,Java 8都一直未能真正推出,直到Java 9才真正成熟起来。对于Java语言来说,模块化系统是一次真正的自我革新,这种革新使得“古老而庞大”的Java语言重新焕发年轻的活力
3.2模块化使用
1.在项目中创建两个模块。一个是myOne,一个是myTwo
2.在myOne模块中创建以下包和以下类,并在类中添加方法
3.在myTwo模块中创建以下包和以下类,并在类中创建对象并使用
4.在myOne模块中src目录下,创建module-info.java,并写入以下内容
5. 在myTwo模块中src目录下,创建module-info.java,并写入以下内容
3.3模块化的基本使用
1.在myOne模块中新建一个包,提供一个接口和两个实现类
2.在myOne模块中修改module-info.java文件,添加以下内容
3.在myTwo模块中新建一个测试类
4.在myTwo模块中修改module-info.java文件,添加以下内容
JAVA中的反射机制和模块化相关推荐
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析
什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功 ...
- formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化
今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...
- java中的反射机制是什么
给大家介绍一下java中的反射机制,java中反射机制更体现出了java的灵活性.多态.和类之间的耦合性. 1:反射是一种间接操作目标对象的机制,只要给定类的名字,就可以通过反设机制获取所有的类信息. ...
- Java中的反射机制详讲
Java中的反射机制详讲 1.反射机制_介绍_Class对象获取 2.反射机制_动态操作_构造器_方法_属性 3.动态编译_DanamicCompile_反射调用main方法问题 好文推荐:排序.查找 ...
- 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等
这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...
- JAVA基础--JAVA中的反射机制详解
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能 ...
- 根据实例详解Java中的反射机制
概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...
- 黑马程序员,黑马论坛 ------JAVA中的反射机制
文章来源:黑马程序员,黑马论坛 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法 ...
最新文章
- poj2553(强连通分量)
- keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...
- [LeetCode]Contains Duplicate III
- Buffers, windows, and tabs
- vboxmanage查询正在运行的vbox虚拟机
- MySQL学习笔记_4_MySQL创建数据表(下)
- C++11 修复了双重检查锁定问题(转)
- Oracle的SQLPLUS命令
- sqlserver操作符篇 优化
- unity3d中如何把对象存进数组
- OA系统中的任务管理
- MyBatis配置文件
- php 简明现代魔法,【转】WinCacheGrind配合XDebug分析PHP程序性能 — 简明现代魔法...
- 面试官最不喜欢不认同的5个跳槽理由
- bequeath_conn
- dms3.0 mysql_DMS 3.0 导入数据库出错-问答-阿里云开发者社区-阿里云
- 腾讯云数据库联手宇信科技发布联合方案,全面助力金融科技安全可控
- 360度绩效评估中的6个关键点,尤其是第4个!
- Wish如何收款?Wish卖家绑定连连跨境支付收款教程!
- Myabtis源码分析五-Mybatis配置加载完全图解,建造者模式的使用,涵盖Java各种技术栈
热门文章
- C语言按各科分数段统计人数,(更新啦)学校学生成绩统计通用模板(科目、分数、统计分数段等均可自定,班级数、学生人数不受限制)...
- java gradle 资源访问_java在gradle工程访问src/test/resources目录下的资源配置文件
- mysql innodb表移植_mysql Innodb引擎独立表空间下通过复制.ibd文件快速迁移数据文件...
- 计算机硬盘能达到5g的速度,5G号称可以达到几GB每秒,但是目前的手机处理器和硬盘可以处理这么庞大的数据量吗?...
- php 监听端口数据客户端ip_PHP做端口监听示例代码
- 【Word】一些实用的小技巧
- unittest Module中的常用6种断言方法
- 【HANA系列】SAP HANA Studio出现Fetching Children...问题
- Python可视化库matplotlib(基础整理)
- SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine