文章目录

  • 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(十六)——反射相关推荐

  1. javaSE (十六)Randon、System类的方法(生成随机数、主动垃圾回收、终止jvm、对程序进行记时、System自带的复制数组的方法)

    生成0到100之间的伪随机数 主动运行垃圾回收器,相当于呼喊保洁阿姨 非0就是异常终止jvm 对程序进行记时 System自带的复制数组的方法 1. 生成0到100之间的伪随机数2. 运行垃圾回收器, ...

  2. NeHe OpenGL教程 第二十六课:反射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. JavaSE基础之(十六)final关键字

    十六.final关键字 16.1 16.2 16.3 16.1 16.2 16.3 引用类型的使用步骤 导包 使用import关键字导包,在类的所有代码之前导包,引入要使用的类型,java.lang包 ...

  4. 【JAVA SE】第十六章 进程、线程、同步锁和线程锁的简介

    第十六章 进程.线程.同步锁和线程安全问题 文章目录 第十六章 进程.线程.同步锁和线程安全问题 一.进程 1.基本介绍 2.进程模型 二.线程 1.基本介绍 2.线程的生命周期 3.线程的优先级 4 ...

  5. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  6. Python之路【第十六篇】:Django【基础篇】

    https://www.cnblogs.com/wupeiqi/articles/5237704.html Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django ...

  7. JAVA面经复习(二十六)面试难度:☆☆☆☆

    JAVA面经复习(二十六)面试难度:☆☆☆☆ 面试难度:☆☆☆☆ 推荐指数:☆☆☆☆☆ 推荐原因:总体来说本篇面经难度不高,且基本都是基础知识,不涉及复杂的分布式应用的工具,适合新手复习. 声明:答案 ...

  8. 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...

  9. OpenGL教程翻译 第二十六课 法线纹理

    第二十六课 法线纹理 背景 我们之前使用的光照技术还算不错,光线在模型表面得到了很好的插值,为场景营造出真实感.但是这种效果还能够有非常大的提升.事实上,我们以前使用的这种插值方式在某种程度上来说是对 ...

最新文章

  1. lnmp mysql 哪个好_lamp与lnmp的选择
  2. java 关于String
  3. HTML中的转义字符 (转)
  4. 【网页前端设计Front end】JavaScript教程.上(看不懂你来打我)
  5. android字体行距,android textview设置字体的行距和字间距
  6. java Design Patterns
  7. opencv 星空_opencv如何将大于5000像素点的轮廓绘制出来?
  8. Springboot 页面访问不到静态资源Failed to load resource: the server responded with a status of 404 ()
  9. 中科大410分计算机排名第几,2021考研成绩发布:中科大400分无缘复试,中山大学321分登顶第二...
  10. pytorch学习笔记(三十八):Image-Augmentation
  11. css文件内容的组织
  12. ruby环境变量的文件读取形式
  13. Lua 实现复数计算器
  14. Qgis教程4:文本数据的加载
  15. EclipseSVN更新和提交
  16. 转载:香港实习生微软实习经验分享
  17. speedoffice(Word)文字内容怎么添加删除线
  18. Android-分辨率以及dip(dp)、dpi、ppi、px、sp、pt说明
  19. ChartDirector 6.3(C ++版)教程分享——图标饼图
  20. 写一个函数insert,用来向一个动态链表插入节点。

热门文章

  1. nginx 配置静态文件目录_nginx配置静态资源服务器
  2. 作研究需要的绣花功夫
  3. CF_275_DIV2_D_Interesting Array
  4. 战争游戏[tarjan]
  5. 程序员的数学3线性代数pdf_程序员带娃福利:《汉声数学》41本PDF
  6. 使用vue3.0和element实现后台管理模板
  7. Linux系统下 Apache+PHP 环境安装搭建
  8. CSS实现自适应不同大小屏幕的背景大图
  9. Python - 字符串
  10. 世界是有生命的(通向财富自由之路学习笔记十五)