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

类的反射

【获取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文件对象没创建实现类对象,调用实现类中的方法

时间: 2024-09-30 15:18:16

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

我的学习之路_第二十二章_事务

JDBC事务 [事务] 作用: 保证多条SQL语句,要么都执行成功,要么都执行失败. mysql数据库,执行SQL语句,自动开启事务,提交事务,回滚事务,把数据永久保存 oracle数据库,执行SQL语句,手动开始会务,提交事务,回滚事务,把数据永久保存. Connection接口中和事务有关的方法: 无返回值 setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态. 参数:autoCommit : true表示自动提交模式, false表示禁用

第十四章_安全性

14.1.验证和授权 验证是检验某个人是否是他/她所声称的那个人的过程. 在Servlet/JSP应用程序中,验证通常是通过要求用户输入username和password来完毕的. 授权主要是确定一个用户具有什么样的訪问级别. 它使用于包括多个訪问区域的应用程序,使用户可以訪问应用程序的某一部分,可是不能訪问其它部分. 比如.网上商店可以分为公共区(供一般的公共浏览和查找商品),买家区(供已注冊用户下单用),以及须要最高訪问级别的管理区.不仅管理员用户自身也须要进行验证,而且还必须是已经被同意訪

算法导论_第十六章_动态规划_creatshare分享会

动态规划 注:该篇为本人原创,转载请注明出处:http://blog.csdn.net/chudongfang2015/article/details/51590817--开心 -.- 个人对动态规划的理解: 1.动态规划是一个付出额外空间来节省时间,就是所谓的空间换时间. 2.动态规划储存每个状态的最优解. 3.动态规划是用来把子问题的结果储存下来,再次用到的时候就不必再进行重复计算. 算法导论对动态规划的解释: 动态规划和分治方法相似,都是通过组合子问题的解来求解原问题,分治方法将问题划分为

全栈JavaScript之路( 二十四 )DOM2、DOM3, 不涉及XML命名空间的扩展

(一)DocumentType 类型的变化新增三个属性: publicId,systemId,internalSubset(内部子集) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [<!ELEMENT name (#PCDATA)>] > 通过, document.doc

学习OpenCV范例(二十四)—ViBe前景检测(二)

最近导师没给什么项目做,所以有那么一点点小时间,于是就研究起了前景检测,既然前景检测有很多种算法,那干脆就把这些模型都学起来吧,以后用到前景检测时至少还有那么几种方法可以选择,上次介绍的是GMM模型,其实GMM模型本身就是一个很不错的模型,现在也很多人在研究,并且做改进,主要是OpenCV有函数调用,用起来非常方便,当我们都在兴高采烈的讨论GMM各种好的时候,B哥不爽了,他说老子是搞前景检测的,怎么可能让你们这么嚣张,而且老子就不按照你那套路来,什么高斯模型,混合高斯模型,我统统不用,就来个简单

【WPF学习】第二十四章 基于范围的控件

原文:[WPF学习]第二十四章 基于范围的控件 WPF提供了三个使用范围概念的控件.这些控件使用在特定最小值和最大值之间的数值.这些控件--ScrollBar.ProgressBar以及Slider--都继承自RangeBase类(该类又继承自Control类).尽管它们使用相同的抽象概念(范围),但工作方式却又很大的区别. 下表显示了RangeBase类定义的属性: 表 RangeBase类的属性 通常不比直接使用ScrollBar控件.更高级的ScrollViewer控件(封装了两个Scro

【WPF学习】第十四章 事件路由

原文:[WPF学习]第十四章 事件路由 由上一章可知,WPF中的许多控件都是内容控件,而内容控件可包含任何类型以及大量的嵌套内容.例如,可构建包含图形的按钮,创建混合了文本和图片内容的标签,或者为了实现滚动或折叠的显示效果而在特定容器中放置内容.设置可以多次重复嵌套,直至达到你所希望的层次深度.如下所示: <Window x:Class="RouteEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2

【WPF学习】第四十四章 图画

原文:[WPF学习]第四十四章 图画 通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)--换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类,但只有GeometryDrawing类能使用已经学习过的几何图形.它增加了决定如何绘制图形的画笔和填充细节.可将GeometryDrawing对象视为矢量插图中的形状.例如,可将标准的窗口元文件格式(.wmf)转换成准备插入用户界面的GeometryDrawi

Python基础教程(第十四章 网络编程)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5538341.html______ Created on Marlowes 本章将会给读者展示一些例子,这些例子会使用多种Python的方法编写一个将网络(比如因特网)作为重要组成部分的程序.Python是一个很强大的网络编程工具,这么说有很多原因,首先,Python内有很多针对常见网络协议的库,在库顶部可以获得抽象层,这样就可以