JavaSE(十六)——反射
文章目录
- 1. 概述
- 2. Class类
- 3. 获取Class对象的三种方式
- 4. 获取类的结构信息
- 5. 创建类的对象
- 6. 调用指定的方法
- 7. 反射操作泛型
1. 概述
- Java可称为“准动态语言”,有一定的动态性,可以利用反射机制获得类似动态语言(即在运行时代码可依据某些条件改变自身结构)的特性。
- 反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
- 要想解剖一个类,必须先要获取到该类的字节码文件对象。
- 反射相关的主要API
java.lang.Class: 代表一个类
java.lang.reflect.Method : 代表类的方法
java.lang.reflect.Field : 代表类的成员变量
java.lang.reflect.Constructor : 代表类的构造器
2. Class类
在Object类中定义了方法:public final Class getClass(),此方法将被所有子类继承。
(1)Class 本身也是一个类
(2)Class 对象只能由系统建立对象
(3)一个加载的类在 JVM 中只会有一个Class实例
(4)一个Class对象对应的是一个加载到JVM中的一个.class文件
(5)每个类的实例都会记得自己是由哪个 Class 实例所生成
(6)通过Class可以完整地得到一个类中的所有被加载的结构
(7) Class类是Reflection的根源,针对任何你想动态加载、运行的类,唯有先获得相应的 Class对象Class类的常用方法
Java内存分析
3. 获取Class对象的三种方式
① Object类的getClass()方法
② 静态属性class
③ Class类中静态方法forName()案例:
运行结果:
4. 获取类的结构信息
- 对象就包含了完整的类的结构信息。可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,如类名、属性(字段)、方法、构造器等。
- 代码演示:
5. 创建类的对象
调用forName()返回的是Class,后需要调用newInstance()实例化
方式一: 调用Class对象的newInstance()方法,条件:①类必须有一个无参数的构造器, ②类的构造器的访问权限需要足。
方式二:1)通过Class类的getDeclaredConstructor(Class … parameterTypes)取得本类的指定形参类型的构造器 2)向构造器的形参中传递一个对象数组进去,里面包含了构造器中所需的各个参数。 3)通过Constructor实例化对象
代码:
运行结果:
6. 调用指定的方法
通过反射,调用类中的方法,通过Method类完成。
① 通过Class类的getMethod(String name,Class…parameterTypes)方法取得 一个Method对象,并设置此方法操作时所需要的参数类型。
② 之后使用Object invoke(Object obj, Object[] args)进行调用,并向方法中传 递要设置的obj对象的参数信息。代码:
若原方法声明为private,则需要在调用invoke()方法之前,显示调用方法对象的setAccessible(true)方法,将可访问private的方法。
代码:
7. 反射操作泛型
- Java采用泛型擦除的机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是一旦编译完成,所有和泛型有关的类型全部擦除。
- 为了通过反射操作这些类型 , Java新增了 ParameterizedType , GenericArrayType , TypeVariable 和 WildcardType 几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型。
- ParameterizedType : 表示一种参数化类型,比如Collection GenericArrayType : 表示一种元素类型是参数化类型或者类型变量的数组类型
TypeVariable : 是各种类型变量的公共父接口
WildcardType : 代表一种通配符类型表达式
JavaSE(十六)——反射相关推荐
- javaSE (十六)Randon、System类的方法(生成随机数、主动垃圾回收、终止jvm、对程序进行记时、System自带的复制数组的方法)
生成0到100之间的伪随机数 主动运行垃圾回收器,相当于呼喊保洁阿姨 非0就是异常终止jvm 对程序进行记时 System自带的复制数组的方法 1. 生成0到100之间的伪随机数2. 运行垃圾回收器, ...
- NeHe OpenGL教程 第二十六课:反射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JavaSE基础之(十六)final关键字
十六.final关键字 16.1 16.2 16.3 16.1 16.2 16.3 引用类型的使用步骤 导包 使用import关键字导包,在类的所有代码之前导包,引入要使用的类型,java.lang包 ...
- 【JAVA SE】第十六章 进程、线程、同步锁和线程锁的简介
第十六章 进程.线程.同步锁和线程安全问题 文章目录 第十六章 进程.线程.同步锁和线程安全问题 一.进程 1.基本介绍 2.进程模型 二.线程 1.基本介绍 2.线程的生命周期 3.线程的优先级 4 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- Python之路【第十六篇】:Django【基础篇】
https://www.cnblogs.com/wupeiqi/articles/5237704.html Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django ...
- JAVA面经复习(二十六)面试难度:☆☆☆☆
JAVA面经复习(二十六)面试难度:☆☆☆☆ 面试难度:☆☆☆☆ 推荐指数:☆☆☆☆☆ 推荐原因:总体来说本篇面经难度不高,且基本都是基础知识,不涉及复杂的分布式应用的工具,适合新手复习. 声明:答案 ...
- 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...
- OpenGL教程翻译 第二十六课 法线纹理
第二十六课 法线纹理 背景 我们之前使用的光照技术还算不错,光线在模型表面得到了很好的插值,为场景营造出真实感.但是这种效果还能够有非常大的提升.事实上,我们以前使用的这种插值方式在某种程度上来说是对 ...
最新文章
- lnmp mysql 哪个好_lamp与lnmp的选择
- java 关于String
- HTML中的转义字符 (转)
- 【网页前端设计Front end】JavaScript教程.上(看不懂你来打我)
- android字体行距,android textview设置字体的行距和字间距
- java Design Patterns
- opencv 星空_opencv如何将大于5000像素点的轮廓绘制出来?
- Springboot 页面访问不到静态资源Failed to load resource: the server responded with a status of 404 ()
- 中科大410分计算机排名第几,2021考研成绩发布:中科大400分无缘复试,中山大学321分登顶第二...
- pytorch学习笔记(三十八):Image-Augmentation
- css文件内容的组织
- ruby环境变量的文件读取形式
- Lua 实现复数计算器
- Qgis教程4:文本数据的加载
- EclipseSVN更新和提交
- 转载:香港实习生微软实习经验分享
- speedoffice(Word)文字内容怎么添加删除线
- Android-分辨率以及dip(dp)、dpi、ppi、px、sp、pt说明
- ChartDirector 6.3(C ++版)教程分享——图标饼图
- 写一个函数insert,用来向一个动态链表插入节点。