我的学习之路_第十四章_反射

author author     2022-09-05     579

关键词:

类的反射

【获取class文件对象的三种方式】:

● 使用Object类中的方法 getClass()
Class<?> getClass() 返回此Object的运行时类.

● 使用类名.class属性

每一个数据类型,基本数据类型和引用数据类型,Java都会为其设置一个class属性
例如: Class class = int.class
Class class = String.class
Class class = Person.class
● 使用Class类中的静态方法forName

静态方法 返回值:Class<?> forName(String className)
返回与带有给定字符串名的类或接口相关联的Class对象.

★ 注意:每个类的class文件对象只会产生一次,是唯一的

【使用反射技术获取类中的构造方法并实例化】

实现步骤:
1.获取Person类的class文件对象
2.使用class文件对象中的方法 getConstructor 获取构造方法


Constructor<?>[] getConstructors() 获取类中所有的公共构造方法
Constructor<?>[] getDeclaredConstructors() 获取类中所有的构造方法,包含私有的

Constructor<T> getConstructor(Class<?>... parameterTypes) 获取指定的公共构造方法
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取指定的构造方法,包含私有的

参数:
... 可变参数,可以有,可以没有
Class<?>... parameterTypes: 构造方法参数的class对象

3.使用Constructor 中的方法 newInstrance 实例化构造方法

返回值:T newInstance(Object... initargs)
使用此Constructor 对象表示的构造方法来创建改构造方法的申明类的新势力,并用指定的初始化参数初始化该实例.

参数:
Object... initargs: 调用构造方法传递的实际参数
返回值: Object: 不知道要创建的是哪个对象

私有化构造方法,无法直接执行,会抛出IlleagalAccessException非法权限异常
可以使用Constructor的父类AccessidleObject中有一个方法叫 setAccessible解决

没有返回值 setAccessible(boolean flay) 将此对象的 accessible 标志设置为指示的布尔值.
值为 true 则指示反射的对象在使用时应该取消Java语言访问检查
值为 false 则指示反射的对象应该实施Java语言访问检查
暴力反射:不推荐,破坏了类的封装性


【快速使用反射创建空参数对象的方法】

使用前提:
1.类中必须有空参数的构造方法
2.空参数的构造方法的修饰符不能是私有private,建议使用publie

在Class类中有一个方法

返回值:T newInstance() 创建此Class对象所表示的类的一个新实例.


【使用反射技术获取类中的成员变量(字段),给成员变量赋值,获取值】

步骤实现:
1.获取Person类的class文件对象
2.使用class文件对象中的getField获取成员变量

返回值:Field[] getFields() 获取类中所有可访问公共字段
返回值:Field[] getDeclaredFields() 获取类中所有的申明字段,包含私有的

返回值:Field getField(String name) 获取类中指定公共成员字段
返回值:Field getDeclaredField(String name) 获取类中指定的申明字段,包含私有的

参数: String name : 字段(成员变量)的名字

3.使用Field中的方法get/set 获取成员变量值,给成员变量赋值

返回值:Object get(Object obj) 返回指定对象上此Field 表示的字段的值
返回值:void set(Object obj,Objcet value) 将指定对象变量上此Field 对象表示的字段设置为指定的新值.

参数: Object obj: 要设置值/获取的值的对象,可以使用反射快速创建
Object value: 给成员变量设置的实际值
返回值: Object:获取成员变量的返回值


【使用反射技术获取类中的成员方法,并执行】

实现步骤:
1.获取Person类的class文件对象
2.使用class文件对象中的方法getMethod获取成员方法

返回值:Method[] getMethods() 获取类中所有的公共方法,包含继承父类的
返回值:Method[] getDeclaredMethods() 包含公共、保护、默认(包)访问和私有方法,但不包括继承的方法.

返回值:Menthod getMethod(String name ,Class<?>...ParameterTypes) 获取类中指定公共成员方法.
返回值Menthod getDeclaredMethod(String name,Class<?>... parameterTypes) 获取类中指定的成员方法,包含私有

参数: String name: 方法的字符串名称
Class<?>... parameterTypes: 方法参数列表的class对象


3.使用Method中的方法 invoke 执行取到的方法

返回值:Object invoke(Object obj,Object... args)
参数:
Object obj: 要执行的方法的所属对象
Object... args: 执行方法,传递的实际参数
返回值 Objcet : 方法的返回值 如果方法没有返回值,Object的值为null


Method类中的方法:getName,获取方法名称
返回值:String getName() 以String形式返回此Method 对象表示的方法名称


【同时又很多类,我们也不知道创建那个类的对象,执行哪个类中的方法】
可以使用反射技术,实现创建不同的对象,执行不同的方法

实现步骤:

1.创建prop.peoperties配置文件,里边保存类名和方法名字(配置文件中要写全路径)
2.使用IO+Properties集合读取配置文件,把文件中的键值对保存到集合中
3.通过key获取value
4.使用获取的value中的类名使用反射技术创建对象
5.使用反射技术,获取方法,执行方法

【反射的综合案例】
通过反射技术,获取jababean的对象,给JavaBean的成员变量注入(赋)值

实现步骤:
1.创建JavaBean(User类)
2.创建data.properties配置文件,配置成员变量的实际使用的值
3.使用IO+Properties集合,读取配置文件,把文件中的数据保存到集合中
4.使用反射技术创建JavaBean对象
5.遍历Properties集合
6.使用Properties集合key拼接setxxx方法
类中的set方法:setId,setUsername,setPassword
集合的key:id,username,password
拼接的过程:1.固定的字符串:"set" 2.获取key的首字符,变成大写 3. 获取key的其他字母

7.使用反射技术获取setxxx方法
8.使用反射技术执行setxxx方法,给成员变量注入值


【使用反射技术获取接口】

返回值:Class<?>[] getInterfaces() 确定此对象所表示的类或接口实现的接口

实现步骤:
1.获取接口实现类的class文件对象
2.会用Class中的方法getInterfaces获取实现的接口
3.使用接口class文件对象没创建实现类对象,调用实现类中的方法

 

c语言第十四章:c语言补充

一、标准预处理宏                __FILE__:当前文件名                __FUNCTION__:当前所在的函数名                __LINE__:当前所在行            printf("文件:%s当前函数:%s第%d行\\n",__FI... 查看详情

第十四章预处理器

1.system("time ");  system("date "); printf("%s,%d",__TIME__,__LINE__);...(FILE,TIME,DATE) 2.#definenamestuff    如果定义的stuff非常的长,可以用反斜杠将他们分成几行。 3.在语句stuff 查看详情

我的学习之路_第四章_异常

一Object类equals方法:四则运算是不能操作引用类型的,而==可以操作引用类型,但是在任何时刻只要是用==比较引用类型,比较的永远都是地址值.返回类型Boolean比较两个对象是否相等,比较的是地址值Object的equals方法比较的是地址值,子... 查看详情

第十四章_安全性

14.1、验证和授权验证是检验某个人是否是他/她所声称的那个人的过程。在Servlet/JSP应用程序中,验证通常是通过要求用户输入username和password来完毕的。授权主要是确定一个用户具有什么样的訪问级别。它使用于包括多个訪问区... 查看详情

《c与指针》第十四章练习

本章问题1.预处理器定义了5个符号,给出了进行编译的文件名、文件行的当前行号,当前日期和时间以及编译器是否为ANSIC编译器。为每个符号举出一种可能的用途。answer:在打印错误信息时,文件名和行号可能是很有用的,尤... 查看详情

我的学习之路_第十一章_字符流

【字符流】IO流的分类★字节流操作的文件不是文本文件字节输入流:InputStream抽象类FileInputStream操作文件的字节输入流字节输出流:OutputStream抽象类FileOutputStream操作文件的字节输出流★字符流 操作的文件是文本文件 字符输入流:Re... 查看详情

我的学习之路_第十六章_xml

【XML】可扩展的标记语言作用:存放数据、配置文件【XML的语法】xml的文件扩展名必须为:xmlxml的内容必须满足以下要求:1.固定的文档声明 2.合格的元素和属性 3.正确的注释 4.符合要求的特殊字符编写规则●文档声明(<?xmlversion="1... 查看详情

我的学习之路_第十七章_javautils

【BeanUtils工具类】javaBaen:Java和数据库所对应关系实体类表(Utils)-->类(User)表中的列-->类中字段(属性)表中的行-->根据类创建的对象javaBean包含:1.私有的成员变量 2.公共的getter/setter方法 3.空参数构造方法 4.toSting方法 5.实现序... 查看详情

第十四章_测试用例设计方法_输入域覆盖法(游戏向)

一、输入域覆盖法1.1什么是输入域覆盖法?  输入域覆盖法的产生是建立在等价类划分法与边界值分析法之上的进阶方法,输入域覆盖方法是两种方法的特点,集合它们的特性主要针对于输入域的测试方法,针... 查看详情

《java编程思想》学习笔记——第十四章类型信息

    运行时类型信息使得你可以在程序运行时发现和使用类型信息。    主要有两种方式:一种是"传统的"RTTI,它假定我们在编译时已经知道了所有的类型;另一种是"反射"机制,它允许我们在运行时发... 查看详情

包子学系列——java基础第十五章_java反射机制

第十四章Java反射机制反射的概述关于反射的理解Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内... 查看详情

2016710101072016-2017-2《java程序设计》第十四章学习心得

    通过这一章的学习,我知道了程序,进程和线程之间的关系,知道了Java实现多线程的两种途径:1.创建Thread类的子类;2.在程序中定义实现Runnable接口的类。线程的中断,线程的六种状态,多线程调度,守护线... 查看详情

cprimerplus读书笔记第十四章

这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点。 1.示例代码/*book.c--仅包含一本书的图书目录*/#include<stdio.h>#defineMAXTITL41#defineMAXAUTL31structbook{/*data*/chartitle[MAXTITL];charauthor[MAXAUTL];floatvalue;};intm 查看详情

python学习——第十四弹

前言上篇文章​​python学习——【第十三弹​​】中介绍了python中的模块,这篇文章接着学习python中的包。python中的包包是一种用“点式模块名”构造Python模块命名空间的方法。在包中存放着一些功能相近的模块。包的创建和导... 查看详情

wpf学习第十四章事件路由(代码片段)

原文:【WPF学习】第十四章事件路由  由上一章可知,WPF中的许多控件都是内容控件,而内容控件可包含任何类型以及大量的嵌套内容。例如,可构建包含图形的按钮,创建混合了文本和图片内容的标签,或者为了实现滚动或... 查看详情

第十四章使用子查询

学习目的:了解是子查询以及如何使用它们。 子查询:查询(query)任何SQL语句都是查询。但此术语一般指SELECT语句。 SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。 利用子查询进行过滤:Q:检索出订... 查看详情

秋季个人阅读计划

...九、十章读后感_第六周周日发布; 第五篇阅读笔记_第十一、十二章读后感_第七周周日发布; 第六篇阅读笔记_第十三、十四章读后感_ 查看详情

第三篇第十四章消防供配电

  查看详情