Java反射介绍[通俗易懂]

Java反射介绍[通俗易懂] 一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.以上的总结就…

大家好,又见面了,我是你们的朋友全栈君。

 

一、反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

以上的总结就是什么是反射
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

Java反射介绍[通俗易懂]

二、Java中为什么需要反射?反射要解决什么问题?

Java中编译类型有两种:

  • 静态编译:在编译时确定类型,绑定对象即通过。
  • 动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。

Reflection可以在运行时加载、探知、使用编译期间完全未知的classes。即Java程序可以加载一个运行时才得知名称的class,获取其完整构造,并生成其对象实体、或对其fields设值、或唤起其methods。

反射(reflection)允许静态语言在运行时(runtime)检查、修改程序的结构与行为。
在静态语言中,使用一个变量时,必须知道它的类型。在Java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误;换句话说,程序在运行时的行为都是固定的。如果想在运行时改变,就需要反射这东西了。

实现Java反射机制的类都位于java.lang.reflect包中:

  1. Class类:代表一个类
  2. Field类:代表类的成员变量(类的属性)
  3. Method类:代表类的方法
  4. Constructor类:代表类的构造方法
  5. Array类:提供了动态创建数组,以及访问数组的元素的静态方法

一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持。

三、使用

Java反射介绍[通俗易懂]

1、获取Class对象的三种方式

1.1 Object ——> getClass();
1.2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
1.3 通过Class类的静态方法:forName(String  className)(常用)

/**
 * 获取Class对象的三种方式
 * 1 Object ——> getClass();
 * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
 * 3 通过Class类的静态方法:forName(String  className)(常用)
 *
 */
public class Fanshe {
	public static void main(String[] args) {
		//第一种方式获取Class对象  
		Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
		Class stuClass = stu1.getClass();//获取Class对象
		System.out.println(stuClass.getName());
		
		//第二种方式获取Class对象
		Class stuClass2 = Student.class;
		System.out.println(stuClass == stuClass2);
//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
		
		//第三种方式获取Class对象
		try {
			Class stuClass3 = Class.forName("fanshe.Student");
//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
			System.out.println(stuClass3 == stuClass2);
//判断三种方式是否获取的是同一个Class对象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		System.out.println("*****************获取公有、无参的构造方法*************");
		Constructor con = clazz.getConstructor(null);
		//1>、因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
		//2>、返回的是描述这个无参构造函数的类对象。


		System.out.println("*************获取公有字段**并调用*****************");
		Field f = stuClass.getField("name");
        System.out.println(f);
		

		System.out.println("***************获取私有的show4()方法******************");
		m = stuClass.getDeclaredMethod("show4", int.class);
		System.out.println(m);
		m.setAccessible(true);//解除私有限定
		Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
		System.out.println("返回值:" + result);

	}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132562.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MANIFEST.MF是个什么?

    MANIFEST.MF是个什么?MANIFEST.MF是个什么?写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot如何只有Main方法就可以运行的?Springboot项目打包

    2022年7月1日
  • 某公司SQL Server 数据库备份方案[通俗易懂]

    某公司SQL Server 数据库备份方案[通俗易懂]概述为了保证XXX公司物业系统数据库的安全,稳定性,数据库管理员应定期备份数据库,采用良好的备份策略,一方面维持数据的安全性;另一方面要保证数据库稳定,顺畅,高效的运行。尽最大的努力减少由于数据丢失或损坏造成的业务系统宕机,须从备份方面做好基本的保障工作。一、备份介绍1.1备份方式SQLServer支持3种类型的备份:完全数据库备份,差异数据库备份,事务日志备份。1.1.1…

    2022年5月15日
  • gbk的不可映射字符_编码gb18030的不可映射字符

    gbk的不可映射字符_编码gb18030的不可映射字符当我们需要输出中文时,在DOS等运行和调试代码时会出现study01.java:3:错误:编码GBK的不可映射字符System.out.println(“浠婂ぉ鐨勬棩鏈熸槸锛?”+day)锛?^或者中文编码错误原因:WindowsCMD和PowerShell的默认编码格式是GBK(汉字内码扩展规范即国标),而VScode、Notepad++甚至是记事本等编辑器的默认编码格式是UTF-8。解决方法

    2022年10月22日
  • linux安装mysql5.7.24

    linux安装mysql5.7.24linux安装mysql5.7.24一、卸载mysql安装有三种方式,包括二进制包安装(UsingGenericBinaries)、RPM包安装、源码安装。一般是前两种比较多卸载方法参考Linux->卸载Mysql方法总结,记得卸载干净二、安装建议路径设置按照写的来将下载的压缩包复制到linux服务器/usr/local/路径下(下载地址https://de…

    2022年5月9日
  • SpringBoot笔记(五)Linux系统与项目部署

    SpringBoot笔记(五)Linux系统与项目部署Linux操作系统与项目部署**注意:**本版块会涉及到操作系统相关知识。现在,几乎所有智能设备都有一个自己的操作系统,比如我们的家用个人电脑,基本都是预装Windows操作系统,我们的手机也有Android和iOS操作系统,还有程序员比较青睐的MacBook,预装MacOS操作系统,甚至连Macbook的Touchbar都有一个自己的小型操作系统。操作系统是管理计算机硬件与软件资源的计算机程序,操作系统可以对计算机系统的各项资源板块开展调度工作,运用计算机操作系统可以减少人工资源分配的工作强度。.

    2022年7月19日
  • VeryCD转型的应对措施,让我们继续分享互联网!!!

    VeryCD转型的应对措施,让我们继续分享互联网!!!
    昨天在家里,看着电影听着歌,忽然VeryCD就被和谐了!有电驴的日子才是好日子啊!我还想下【告白】呢!我还想下【大地惊雷】呢!……
    已经有不少同学注意到了,VeryCD的音乐区被和谐了,电影区和剧集区也不提供下载链接了,俨然变成一个在线视频网站。那么高清电影、剧集,音乐专辑、电影原声就此离我们远去了?不!
    VeryCD怂掉也是迟早的事儿,它在中国光明正大的推广盗版如此之久已经是一个奇迹了,但VC倒了并不会影响我们下载emule资源。简单来说VeryCD是一个商业公司,

    2022年7月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号