文章目录

  • 前言
  • 一、反射机制
  • 二、反射的用途
  • 三、反射相关的类(重要)
    • 3.1 Class类(反射机制的起源 )
    • 3.2 通过反射调用构造方法
    • 3.3 通过反射调用普通方法
    • 3.4 通过反射调用类属性
  • 四、反射的优缺点
  • 总结

前言

博主个人社区:开发与算法学习社区

博主个人主页:Killing Vibe的博客

欢迎大家加入,一起交流学习~~

一、反射机制

反射:在JVM运行时,一切框架的基础。

对于JVM中任何一个类,都能动态获取该类的所有属性和方法。

对于JVM中的任何一个对象,都能动态调用该对象的属性和方法。

动态获取信息以及调用对象机制称为反射机制

二、反射的用途

1、在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法
2、反射最重要的用途就是开发各种通用框架,比如在spring中,我们将所有的类Bean交给spring容器管理,无论是XML配置Bean还是注解配置,当我们从容器中获取Bean来依赖注入时,容器会读取配置,而配置中给的就是类的信息,spring根据这些信息,需要创建那些Bean,spring就动态的创建这些类。

拓展:

Java程序中许多对象在运行时会出现两种类型:运行时类型(RTTI)和编译时类型,例如Person p = new Student();这句代码中p在编译时类型为Person,运行时类型为Student。程序需要在运行时发现对象和类的真实信息。而通过使用反射程序就能判断出该对象和类属于哪些类。

运行时明确该引用到底是啥类型就可以通过反射机制。

三、反射相关的类(重要)

这些类都在java.lang.reflect包下面。

1.Class类: 反射核心类,使用class关键字,包括数组,包括接口编译后生成的class文件就对应一个唯一的class对象,由JVM产生,使用这个class对象就可以获取该类的所有信息。

例如定义如下一个学生类:

class Student{int age;String name;
}

执行 javac Student.java 后 => Student.class

将JVM启动之后,Student类被加载到JVM之后就会产生一个全局唯一的Student.class对象,由JVM产生,就根据这个对象来反射操作Student类

2.Field类:反射调用类中的成员/类属性

3.Method类:反射调用类中的成员/类方法

4.Constructor类:反射调用构造方法

3.1 Class类(反射机制的起源 )

Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为一个对象,这个对象就是 java.lang.Class .这样当程序在运行时,每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这个类成为一个动态的类 .

无论要通过反射机制干啥事情,首先第一步就是获取该类的class对象(由JVM产生的,全局唯一)

三种方式:

  1. 调用Class.forName(类的全名称) 【包名.类名】
  2. 调用类名称.class 【属性】
  3. 通过该类的任意对象的getClass()

3.2 通过反射调用构造方法

普通的get只能获取public权限的方法或者属性,getDeclared…()可以获取所有权限的方法或属性

示例:

   // 1.获取所有public权限的构造方法Constructor[] constructors = cls.getConstructors();for (Constructor constructor : constructors) {System.out.println(constructor);}System.out.println("------------------------------");// 获取该类所有构造方法Constructor[] constructors1 = cls.getDeclaredConstructors();for (Constructor constructor : constructors1) {System.out.println(constructor);}

破坏封装产生对象:

// 破坏封装,通过反射破坏private封装,调用私有构造方法
constructor.setAccessible(true);
Student student = constructor.newInstance("Killing Vibe");
System.out.println(student);

3.3 通过反射调用普通方法

invoke方法:


示例:

假设已经获取了Student类的反射对象cls,Student类中有一个test方法

 //2.获取要调用方法的Method对象Method method1 = cls.getDeclaredMethod("test");// test是静态方法,无需产生Student对象method1.invoke(null);Method method2 = cls.getDeclaredMethod("fun",String.class);Student student = new Student("VIBE","男",18);method2.invoke(student,"传入的参数");

3.4 通过反射调用类属性

Field.get()方法 : 通过obj对象获取相关属性的值,属性为静态属性,则传入null

Field.set()方法:通过obj对象修改相关属性的值,若为静态对象,则传入null

示例:

假设已经获取了Student类的反射对象cls,Student类中有country,age属性

   // 3.获取要拿到的属性Field对象Field field = cls.getDeclaredField("country");System.out.println(field.get(null));Field field1 = cls.getDeclaredField("age");Student student = new Student("VIBE","男",18);System.out.println(field1.get(student));field1.set(student,20);System.out.println(field1.get(student));

运行如下:

四、反射的优缺点

优点:

  1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法
  2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力
  3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。

缺点

  1. 使用反射会有效率问题。会导致程序效率降低。
  2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。

总结

以上就是Java反射机制的原理以及相关类和代码实现,如果有什么疑问或者需要完整代码可以私信博主~~感谢支持

Java反射机制(简单易懂)相关推荐

  1. Java反射机制简单使用

    1.Java反射相关类所在package: java.lang.reflect.* 2.开始使用Reflection: 使用reflect相关类,遵循三个步骤: a.获取想要操作类的 java.lan ...

  2. java反射机制的简单使用和优缺点

    java反射机制的使用 一.反射是什么? JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类信息以及动 ...

  3. Java:一步步带你深入了解神秘的Java反射机制

    Java:一步步带你深入了解神秘的Java反射机制· 前言 在 Java中,反射机制(Reflection)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘 今天,我将献上一份 Jav ...

  4. 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换

    作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...

  5. java基础-java反射机制

    2019独角兽企业重金招聘Python工程师标准>>> 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩" ...

  6. 利用java反射机制进行对象操作

    我们经常使用COMMONS-BEANUTILS包来进行bean的操作,例如从map到bean获从bean到map的映射,那么实现的原理是什么呢,下面举个简单的操作的例子:首先,我建立一个bean pu ...

  7. Java反射机制及API使用

    原文地址 反射简单来说,就是动态加载对象,并对对象进行剖析.在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道并获取这个类的所有属性和方法. Java反射机制的作用: 在运行时判断任意 ...

  8. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

  9. 工作中用到的java反射机制_(转)JAVA-反射机制的使用

    Java反射机制的实现原理 反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠 ...

最新文章

  1. GetSystemMetrics()函数的用法
  2. mysql更新锁机制_mysql查询更新时的锁表机制分析
  3. python基础第六天
  4. python常用内置函数总结-Python学习教程之常用的内置函数大全
  5. python 的基础 学习 第七天 is id 编码的补充
  6. 设置 页面 内容并排平均显示
  7. java web 手机验证_Java 手机Web开发 身份验证
  8. python fine函数_python find()函数
  9. 前5个有用的隐藏Eclipse功能
  10. 前端学习(2634):修改webstrom颜色
  11. 深度学习基础 | 超详细逐步图解 Transformer
  12. 论剑乌镇:历届互联网大会热词盘点
  13. CF1033A. King Escape的题解
  14. 密码学基础(三):非对称加密(RSA算法原理)
  15. 详解手机注册验证码操作思路与流程
  16. 2010年10月14日糗事TOP10
  17. 前端上传超大文件解决方案
  18. access计算机二级大纲,计算机二级Access考试内容大纲
  19. Civil3D 2018-02 点
  20. 三步必杀(高阶差分系列)

热门文章

  1. 贷帮推出互联网金融行业内首个微信理财平台
  2. rxjs为什么用的人少_转发给学生:为什么开展创新创业教育
  3. Netty框架之概述及基本组件介绍
  4. KBPC610-ASEMI整流方桥6A 1000V
  5. 品读国学经典之三——《齐桓晋文之事》
  6. SAP ME学习笔记(六)搭建生产线
  7. 一个90后关于ZG足球的思考【卡塔尔世界杯】
  8. Linux正则表达式文件分割合并软连接
  9. 计算机连接网络是飞行模式怎么办,网络设置只剩飞行模式怎么办_win10笔记本打开只有飞行模式的解决方法...
  10. 平车调整刀片如何调整_裁切机的上刀下刀如何调整?