广告
返回顶部
首页 > 资讯 > 精选 >Java反射的概念和机制
  • 108
分享到

Java反射的概念和机制

2023-06-02 16:06:43 108人浏览 泡泡鱼
摘要

这篇文章主要讲解了“Java反射的概念和机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java反射的概念和机制”吧!1. 什么是反射?什么是反射?在官方文档中是这样说的:Reflecti

这篇文章主要讲解了“Java反射的概念和机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java反射的概念和机制”吧!

1. 什么是反射?

什么是反射?在官方文档中是这样说的:
Reflection is commonly used by programs which require the ability to examine ORModify the runtime behavior of applications running in the Java virtual Machine.
This is a relatively advanced feature and should be used only by developers whohave a strong grasp of the fundamentals of the language.
With that caveat in mind, reflection is a powerful technique and can enable applications to perform operations which would otherwise be impossible

翻译一下:

反射技术通常被用来检测和改变应用程序在 Java 虚拟机中的行为表现。它是一个相对而言比较高级的技术,通常它应用的前提是开发者本身对于 Java 语言特性有很强的理解的基础上。值得说明的是,反射是一种强有力的技术特性,因此可以使得应用程序执行一些常规手段无法企及的目的。

个人理解:反射是一种很牛x的技术,使用反射的条件是程序猿是一个大猿,对java的特性非常理解。反射的牛逼之处在于他可以完成一些非常规操作。

举个栗子来说明一下:

稍微想了一下,觉得用煮饭这个栗子来说明吧,不知道准不准确(^,^)。平时我们在家里一般是用电饭煲来煮饭的,煮饭的步骤一般是:淘米——>擦干锅底——>把锅放到电饭煲里——>合上盖子,通电,电饭煲工作——>饭煮熟了,可以吃了,但现在有个需求,我要在煮饭的过程中加个鸡蛋,这时怎么解决呢?是不是打开正在通电煮饭的电饭煲,然后把鸡蛋放进去呢?(来自吃货的需求^_^)其实反射就相当于刚才加鸡蛋的过程。所以反射很牛逼,他不按常规套路出牌,在程序运行的过程中搞一些小动作,以达到“吃货”的目的。补充一下:“淘米——>擦干锅底——>把锅放到电饭煲里——>”这个过程可以看做编码编译过程,“——>合上盖子,通电,电饭煲工作”可以看做是程序运行过程,“——>饭煮熟了,可以吃了”可以看做程序运行结束。
Java反射的概念和机制

2.java中的反射机制

2.1 反射中常见的类

理解反射机制时,首先熟悉一下几个类:

1)Class类

Class类实例表示正在运行的Java应用程序中的类和接口。Class是普通类、接口、枚举类、数组等的抽象,即它们的类型就是Class,它们是Class的实例。

既然Class代表着类和接口,那么我们可以通过他的实例(字节码文件)来获取对应类或接口的信息,如:注解、修饰符、类型、类的名称、属性、方法、构造方法、直接父类和子类等,还有可以创建它的实例,但只能调用无参构造方法来创建。

什么看不懂?举个栗子,我们都知道,生物可以分为动物、植物、微生物和病毒等,而动物又有人、喵星人、小狗等,植物、微生物和病毒也一样。同样,我们可以类比一下,生物就是Class,动物是普通类,植物是接口,微生物是枚举类、病毒是数组(枚举和数组是特殊的类),而人、喵星人、小狗是我们熟悉的对象,如图
Java反射的概念和机制
这下可整明白了吧,普通类、接口、枚举、数组其实都可以当做Class的对象。

2)Field类

Field表示类的属性,属性含有修饰符、类型、属性名称和值。所以可以通过Field的实例获取属性的修饰符、类型、属性名称,并且可以修改属性的值。

3)Method类

Method表示类的成员方法,方法包括注解、修饰符、返回类型、方法名,参数等。所以可以通过Method的实例获取方法的的信息,如,注解、修饰符、返回类型、方法名并且可以调用所表示的方法。

4)Constructor类

Constructor表示构造方法,可以通过Constructor的实例获取构造方法的信息,如,修饰符等,并且可以通过它来创建它所在类的的实例。

5)Modifier类

Modifier表示修饰符,可通过它来获取修饰符的信息,例如何种修饰符等

6)Annotation

Annotation代表注解

以上类都位于java.lang中

2.2 获取Class对象的方法

了解了什么是反射后,是不是也想体验一下反射这种骚操作?

想秀操作,首先要获取Class对象吧,因为Class对象是代表着各种类,有了它之后才可以得到类的各种信息。获取方法如下:

1)通过object.getClass()

public static void main(String[] args) {                Car car = new Car();                Class clazz = car.getClass();    }

注意:此方法不适用于int、float等类型

2)通过(类型名).class、包装类.Type

public static void main(String[] args) {        Class clazz = Car.class;        Class cls1 = int.class;        Class cls2 = String.class;        Class cls3=Iteger.Type    }

3)通过Class.forClass(String 类的全限定名)

1 try {2    Class clz = Class.forName("com.frank.test.Car");3 } catch (ClassNotFoundException e) {4    e.printStackTrace();5 }

采用哪种方法来获取,看实际情况而定。

2.3获取类信息

有了Class对象后,就可以获取类的成员(方法+属性)、注解和类的修饰符等。上面也说了,java中方法用Method类表示、属性用Field类表示、注解用Annotation类来表示、修饰符用Modifier类表示。Class类中有对应的方法来获取他们。如下:

2.3.1 获取属性Field的对象

//获取所有的属性,但不包括从父类继承下来的属性public Field[] getDeclaredFields() throws SecurityException //获取自身的所有的 public 属性,包括从父类继承下来的。public Field[] getFields() throws SecurityException//获取在本类中声明的指定的属性,参数为属性的名称public Field getDeclaredField(String name) //获取指定的公有属性,包括父类的,参数为属性的名称public Field getField(String name)

2.3.2 获取方法Method对象

//获取本类声明指定的的方法,第一个参数是方法的名称,后面的参数是方法参数类型的类,//如获取setName(String name)方法,getDeclareMethod(“setName”,String.Class)public Method getDeclaredMethod(String name, Class< ?>... parameterTypes)//获取公有的方法,包括父类的public Method getMethod(String name, Class< ?>... parameterTypes)//获取本类中声明的所有方法public Method[] getDeclaredMethods()//获取所有的公有方法,包括父类的public Method[] getMethods()

2.3.3 获取构造器Constructor对象

 //获取本类中指定的构造方法public ConstructorgetDeclaredConstructor(Class< ?>... parameterTypes)//获取指定的公有构造方法public ConstructorgetConstructor(Class< ?>... parameterTypes)//获取本类中所有的构造方法public Constructor< ?>[] getDeclaredConstructors() throws SecurityException //获取本类中所有的公有构造方法public Constructor< ?>[] getConstructors()

构造方法的获取与普通方法的获取大致是一样的。

------------------------------------------------------------------

以上的方法都是在Class类中,别傻傻不知道(别问我怎么知道的>_>),然后通过Class对象调用就可以了。

这里只是列举了常用类信息的的获取方法,其他信息的获取方法,看api文档吧,如注解、类的Class的对象(额好像有点绕。。。)等.

2.4 获取类成员信息

上面只是获取了类的成员所代表类的对象,我们还要使用他们或者获取成员的信息(名称、修饰符等)。因为有了代表成员的对象,使用对象调用实例方法就可以了。

2.4.1 Field类

Field类的方法大概可以分为两种,一种是获取属性的信息,另外一种是设置属性的值。

第一种:

//返回由此 Field对象表示的字段的名称 String  getName() //返回一个 类对象标识了此表示的字段的声明类型 Field对象。 Class< ?>  getType() //返回由该 Field对象表示的字段的Java语言修饰符,作为整数。把整数作为Modifier的构造方法的参数,就可以获取该整数代表的修饰符类的对象了int  getModifiers() ----------------------------------------------------------------//获取类型为 int的静态或实例字段的值,或通过扩展转换转换为类型 int的另一个原始类型的值。int getInt(Object obj) //获取类型为 long的静态或实例字段的值,或通过扩大转换获得可转换为类型 long的另一个基本类型的值。 long getLong(Object obj) ......此处省略一堆get**(Object obj)的方法,属性是什么基本类型,就get什么就行了14属性是引用类型,那么就调用以下方法//返回该所表示的字段的 Field ,指定的对象上。  16 Object get(Object obj)

第二种:

//设置作为一个字段的值 double指定的对象上。  void setDouble(Object obj, double d) //设置作为一个字段的值 float指定的对象上。  void setFloat(Object obj, float f) //设置作为一个字段的值 int指定的对象上。void setInt(Object obj, int i) ........此处省略一堆set**()方法,属性是什么基本类型就set什么就行了属性是引用类型,那么就调用以下方法//将指定对象参数上的此 Field对象表示的字段设置为指定的新值。void  set(Object obj, Object value)

注意啦:如果没有访问权限的话,默认是不能设置属性值的,那��么办呢?是不是就秀不了操作了?然而,前面也说了,反射很牛逼,可以来一些非常规操作,
这时我们调用Class对象的setAccessible(true)方法就可以了!
是不是觉得反射可以很强?
2.4.2 Method类
Method类的方法主要是获取方法的信息
部分方法:

1 int getModifiers() //返回由该对象表示的可执行文件的Java语言modifiers 。  2 String getName() //返回由此 方法对象表示的方法的名称,作为 String 。  3 Annotation[][] getParameterAnnotations() //返回一个 Annotation s的数组数组,表示由该对象表示的Executable的形式参数的声明顺序的 Executable 。  4 int getParameterCount() //返回由此对象表示的可执行文件的形式参数(无论是显式声明还是隐式声明)的数量。  5 Class< ?>[] getParameterTypes() //返回一个 类对象的数组, 类以声明顺序表示由该对象表示的可执行文件的形式参数类型。

2.4.3 Constructor类
Constructor类的方法主要是获取构方法的信息和创建对象

获取方法信息:

1 int getModifiers() //返回由该对象表示的可执行文件的Java语言modifiers 。  2 String getName() //以字符串形式返回此构造函数的名称。  3 Annotation[][] getParameterAnnotations() //返回的数组的数组 Annotation表示的形参进行注释s时,声明顺序的的 Executable该对象表示。  4 int getParameterCount() //返回由此对象表示的可执行文件的形式参数(无论是显式声明还是隐式声明)的数量。  5 Class< ?>[] getParameterTypes() //返回一个 类对象的数组, 类以声明顺序表示由该对象表示的可执行文件的形式参数类型。

创建对象的方法先不说,放到后面去。

2.5 反射创建对象和调用方法

2.5.1 创建普通类的对象

创建普通类的对象可以分为两种方法

第一种:调用Class对象的方法

4 //首先获取Class对象5 Class clazz=Class.forClass("test.Student");6 //创建对象7 Student stu=(Student)clazz.newInstance();注:此方法只能创建无参构造函数的类的对象

第二种:通过Constructor的newInstance()方法

 //首先创建Class对象Class clazz=Class.forClass("test.Student");//获取想调用的构造函数Constructor constructor=clazz.getConstructor(String.class, int.class);//调用Constructor的newInstance()方法Student stu=(Student)constructor.newInstance("大王",20);

2.5.2 创建数组

数组本质上是一个 Class,而在 Class 中存在一个方法用来识别它是否为一个数组。

反射创建数组是通过 Array.newInstance(T.class,维数) 这个方法。

第一个参数指定的是数组内的元素类型,后面的是可变参数,表示的是相应维度的数组长度限制。

比如,我要创建一个 int[2][3] 的数组。

1 Int[][]  a=Array.newInstance(Integer.TYPE, 2, 3);

2.5.3 调用方法

用了上面的方法,就有Class对象,有方法Method对象,有实例,现在已经万事俱备,只欠东风了。

那我们怎么调用方法呢?在Method类有这么一个方法Object invoke(Object obj, Object... args),object为实例对象,args为调用方法的参数

来个栗子:

Class< ?> c = Class.forName("com.kal01.reflect05.Person");//获取Class对象Person p1 = (Person) c.newInstance();//获取实例Method m3 = c.getDeclaredMethod("test");//获取方法m3.setAccessible(true);//当没有访问权限时,设置一下就可以m3.invoke(p1);//调用方法m3.setAccessible(false);//修改了访问权限,记得修改回来

2.6 静态加载与动态加载

看到这里是不是有个疑问,反射调用类的方法好像除了复杂之外,跟我们平时调用没什么区别。何必弄那么花里胡哨?

所以在这里简单说一下静态加载与动态加载。

回想一下之前煮饭的那个栗子,静态加载和动态加载的这个例子有点相似。

静态加载:我们在程序中使用类时,静态加载是要求要使用的类必须要求在编译的时候存在,否则编译器报错,无法运行程序。编码时忘记导包时,经常会出现这种错误。

动态加载:利用反射来加载类(即获得Class对象),不要求我们在编译期存在要是用的那个类,在程序运行时,才去寻找类(可以从jar包,网络等寻找),然后把类加载到方法区中,如果没有找到这个类会抛出ClassNotFoundException异常。

有图有真相:
Java反射的概念和机制

感谢各位的阅读,以上就是“Java反射的概念和机制”的内容了,经过本文的学习后,相信大家对Java反射的概念和机制这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java反射的概念和机制

本文链接: https://www.lsjlt.com/news/230541.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java反射的概念和机制
    这篇文章主要讲解了“Java反射的概念和机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java反射的概念和机制”吧!1. 什么是反射?什么是反射?在官方文档中是这样说的:Reflecti...
    99+
    2023-06-02
  • java反射机制的概念是什么及怎么用
    今天小编给大家分享一下java反射机制的概念是什么及怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Java反射机制...
    99+
    2023-06-30
  • golang反射机制的基本概念和常见用法有哪些
    这篇文章主要介绍了golang反射机制的基本概念和常见用法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang反射机制的基本概念和常见用法有哪些文章都会有所收获,下面我们一起来看看吧。前言golan...
    99+
    2023-07-05
  • Java 反射机制
    简介: Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个...
    99+
    2022-11-12
  • Java反射概念与使用实例代码
    目录前言反射基础数据准备基于反射创建对象获取反射中的对象获取类中属性获取类中的构造方法获取类中方法结语前言 大家好,瑞雪后的第一天,每个周一的大家都期待这周五的来临。相信很多小伙伴...
    99+
    2022-11-12
  • Java反射机制详解
    目录类的声明周期不同阶段都可以获取类对象获取Class类对象的方式的场景class类对象的功能如何获取私有变量的值根据有无主方法判断进程和线程反射出现的背景(记住)反射出现的背景类的...
    99+
    2022-11-13
  • Java反射机制介绍
    1.通过反射,我们可以构建实例,得到成员变量的值,得到方法并调用。 还可以获得定义在成员变量、方法、方法参数上的注解。 接下来看代码实现,然后讲原理。 1)构建无参实例:通过反射调用...
    99+
    2022-11-13
  • java 反射机制初探
    最近再看书时,书中使用了java的动态代理机制,随即在网上搜了些文章看了一下,既然有动态代理那就有静态代理,所谓静态代理,就是在你些的代理类中需要使用到具体的被代理类。而所谓动态代理,则不需要在代理类中使用到被代理类,根本不知道起要代理那个...
    99+
    2023-06-03
  • Java进阶知识之反射的概念与获取方法
    一、反射的基本概念 1、反射的概念 将类的各个组成部分封装成其他对象,这就是反射的机制. 通过上图,我们可以通过反射获得Person类的Class对象,通过获得Class对象来获...
    99+
    2022-11-12
  • java映射的概念是什么
    在Java中,映射(Map)是一种数据结构,用于存储键值对(key-value pairs)的集合。每个键(key)都是唯一的,而值...
    99+
    2023-08-23
    java
  • Oracle Golden Gate - 概念和机制
    Oracle Golden Gate - 概念和机制 (ogg)Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉、变换、投递。 OGG支持的异构环境有: OGG的特性:对生产系统影响小:...
    99+
    2022-10-18
  • Java中的反射机制详解
    目录一、什么是反射?二、为什么要用反射三、Class类四、获取Class类对象的四种方式五.通过反射构造一个类的实例①使用Class.newInstance②通过反射先获取构造方法再...
    99+
    2022-11-12
  • Java 中反射的概念、作用和特点,在什么情况下使用反射及使用实例
    反射的概念 反射(Reflection)是 Java 的一种特性,它可以让程序在运行时获取自身的信息,并且动态地操作类或对象的属性、方法和构造器等。通过反射功能,可以让我们在不知道具体类名的情况下,依...
    99+
    2023-10-22
    java
  • java反射机制最详解
    目录java反射机制什么是反射?反射的功能:反射常用类:1.Class枚举类2.Constructor构造器3.Method方法类4.Field变量类反射运行指示图通过反射获取对象总结java反射机制 什么是反射? 在java开发中有一个...
    99+
    2020-08-07
    java java反射机制
  • 什么是java反射机制
    java:“一切即对象”,感觉java语言本身在不断践行着这句话。java反射机制的基础来源于一个Class类,我们可以通过这个类里面的方法来对每一个类进行读取、实例化等。对象表示或封装一些数据。一个类被加载后,jvm会创建一个对应该类的C...
    99+
    2019-08-24
    java入门 java 反射机制
  • java反射机制是什么
    这篇文章主要介绍了java反射机制是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-14
  • Java-反射机制(超详解)
    Java反射机制概述 前言一、Java反射机制概述1. Java Reflection2. 动态语言 vs 静态语言 二、 Class类的理解1. 类的加载过程1.1 初步了解1.2 类的加载过程图解1.3 了解:什么时候会发...
    99+
    2023-08-17
    java 开发语言
  • Java中反射机制和作用详解
    前言 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象。 那么接下来大师就带你们了解一下反射是什么,为什么...
    99+
    2022-11-12
  • Java重点:反射机制的使用
    目录 一、概念 二、类类 1、类类的获取方式 1)类名.Class 2)对象.getClass() 3)Class.forName() 三、反射实例化 1、调用一个公有的无参构造方法 2、调用一个公有的一个参构造方法 3、调用一个公有的两...
    99+
    2023-09-12
    java 开发语言 jvm eclipse java-ee
  • Java 反射机制的实例详解
    Java 反射机制的实例详解前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文 Java反射机制定义Java反射机制是指在运行状态中...
    99+
    2023-05-31
    java 反射机制 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作