java --- 反射

news2024/9/22 7:35:00

目录

一、什么是反射?

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

三、反射获取构造方法(Constructor)

四、反射获取成员变量(Field)

五、反射获取成员方法(Method)


一、什么是反射?

  • 反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
  • 反射就是把java类中的各种成分映射成一个个的Java对象

  • 例如:一个类有:成员变量、方法、构造方法等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。

提问:为什么不能用IO流从上往下一行一行的进行读取呢?

  • 但是当我们读取到构造方法和普通成员方法时,无法区分。
  • 成员变量和局部变量也很难区分。

因此我们使用 反射 获取成员变量就可以得到成员所有信息

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

使用反射的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)

  1.  Class.forName ( " 全类名 " ) ;             最为常用
  2. 类名 . class       一般更多的是当做参数进行传递
  3. 对象 . getClass ( ) ;  当已经有类对象是才能使用

//第一种方式
        Class cl1 = Class.forName("反射.Student");
        System.out.println(cl1);

        //第二种方式
        Class cl2 = Student.class;
        System.out.println(cl2);
        System.out.println(cl1 == cl2);

        //第三种方法
        Student s = new Student();
        Class cl3 = s.getClass();
        System.out.println(cl3);
        System.out.println(cl1 == cl3);

三、反射获取构造方法(Constructor)

Class类中获取构造方法的方法:

Constructor <?> [ ] getConstructors()返回所有公共构造方法对象的数组
Constructor <?> [ ] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor <T> getConstructor ( Class <> .. parameterTypes )返回单个公共构造方法对象
Constructor <T> getDeclaredConstructor(Class <>.. parameterTypes)返回单个构造方法对象
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class cl1 = Class.forName("反射.Student");

        //利用反射获取构造方法
        Constructor[] con1 = cl1.getDeclaredConstructors();
        for (Constructor c : con1) {
            System.out.println(c);
        }
        Constructor con2 = cl1.getDeclaredConstructor(int.class);
        System.out.println(con2);

        //获取权限修饰符
        int modifiers = con2.getModifiers();
        //private :2 ,public:1 ,protected :4
        System.out.println(modifiers);

        //创建对象
        con2.setAccessible(true);//为了调用非public的方法,需要这样
        con2.newInstance(18);
    }

四、反射获取成员变量(Field)

Class类中获取成员变量的方法:

Field [ ]  getFields()返回所有公共成员变量对象的数组
Field [ ]  getDeclaredFields ( )返回所有成员变量对象的数组
Field getField ( String name )返回单个公共成员变量对象
Field getDeclaredField ( String name )返回单个成员变量对象

Field类中用于创建对象的方法:

void set ( Object obj , Object value )赋值
Object get ( Object obj )获取值
// 1.获取Class字节码文件的对象
		Class clazz = Class.forName("ReFlect.Student");
 
		// 获取成员变量
		//获取所有的成员变量
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			System.out.println(field);
			//private java.lang.String ReFlect.Student.name
			//private int ReFlect.Student.age
			//public java.lang.String ReFlect.Student.gender
		}
		
		//获取单个成员变量
		Field gender = clazz.getField("gender");
		System.out.println(gender);
		//public java.lang.String ReFlect.Student.gender
		
		//Field name = clazz.getField("name");  
		//无法获取 name是private私有的
		Field name = clazz.getDeclaredField("name"); 
		System.out.println(name);
		//private java.lang.String ReFlect.Student.name
		
		//获取到成员变量后我们可以继续:
		//1.获取权限修饰符
		int modifier = name.getModifiers();
		System.out.println(modifier);  //2
		//2.获取成员变量名
		String n = name.getName();
		System.out.println(n); //name
		//3.获取数据类型
		Class<?> type = name.getType();
		System.out.println(type); //class java.lang.String
		//4.获取成员变量记录的值
		Student s = new Student("张三",23,"男");
		name.setAccessible(true);
		Object value = (String)name.get(s);  //张三
		System.out.println(value);
		//5.修改成员变量记录的值
		name.set(s, "李四");
		System.out.println(s);  //Student [name=李四, age=23, gender=男]	
	}

五、反射获取成员方法(Method)

Class类中获取成员方法的方法:

Method [ ]  getMethods ( )返回所有公共成员方法对象的数组,包括继承的
Method [ ]  getDeclaredMethods ( )返回所有成员方法对象的数组,不包括继承的
Method getMethod ( String name ,  Cass <?> .. parameterTypes )返回单个公共成员方法对象
Method getDeclaredMethod ( String name ,  Class<?>... parameterTypes )返回单个成员方法对象

Method类中用于创建对象的方法:

Object invoke ( Object obj ,  Object... args )运行方法

参数一:用obj对象调用该方法

参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)

public static void main(String[] args) throws 
           ClassNotFoundException, NoSuchFieldException {
 
		// 1.获取Class字节码文件的对象
		Class clazz = Class.forName("ReFlect.Student");
 
		// 2.获取里面所有的方法对象
		//(包含所有父类中的所有的公共方法)
		Method[] methods1 = clazz.getMethods();
		for(Method method : methods1) {
			System.out.println(method);
		}
		//获取里面所有的方法对象(只能获取本类中私有方法)
		Method[] methods2 = clazz.getDeclaredMethods();
		for(Method method : methods2) {
			System.out.println(method);
		}
		
		//3.获取指定单一方法对象
		Method m = clazz.getDeclaredMethod("eat", String.class);
		System.out.println(m); //private void ReFlect.Student.eat(java.lang.String)
		  //1.获取权限修饰符
		int modifers = m.getModifiers();
		System.out.println(modifers); //2
		//2.获取方法名
		String name = m.getName();
		System.out.println(name);  //eat
		//3.获取方法形参
		Parameter[] parameters = m.getParameters();
		for (Parameter parameter : parameters) {
		System.out.println(parameter);	 //java.lang.String arg0
		}
		//4.获取方法返回值
		//5.获取方法抛出异常
		Class<?>[] exceptionTypes = m.getExceptionTypes();
		for(Class exceptiontype : exceptionTypes) {
			System.out.println(exceptiontype);
			//class Java.io.TOException
			//class java. lang. NullPointerException
			//class java. lang.ClassCastException
 
		}
		
		//方法运行
		Student s = new Student();
		m.setAccessible(true);
		m.invoke(s, "汉堡包");
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

map|动态规划|单调栈|LeetCode975:奇偶跳

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 涉及知识点 单调栈 动态规划 map 题目 给定一个整数数组 A&#xff0c;你可以从某一起始索引出发&#xff0c;跳跃一定次数。在你跳跃的过程中&#xff0c;第 1、3、5… 次跳跃称为奇数跳跃&#xff0c;而第 2、…

关于Python里xlwings库对Excel表格的操作(十五)

这篇小笔记主要记录如何【获取单元格数据的对齐方式或更改单元格数据的对齐方式】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xf…

【模式识别】解锁降维奥秘:深度剖析PCA人脸识别技术

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《模式之谜 | 数据奇迹解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 &#x1f30c;1 初识模式识…

二维码智慧门牌管理系统:实现数据通信安全

文章目录 前言一、传输隧道加密技术二、传输数据加密技术三、数据接入鉴权技术 前言 随着信息技术的蓬勃发展&#xff0c;智慧门牌管理系统已成为现代商业和家庭重要的一部分。然而&#xff0c;系统普及的同时也带来了数据通信安全的突出问题。为了解决这一挑战&#xff0c;二…

【设计模式-2.5】创建型——建造者模式

说明&#xff1a;本文介绍设计模式中&#xff0c;创建型设计模式中的最后一个&#xff0c;建造者模式&#xff1b; 入学报道 创建型模式&#xff0c;关注于对象的创建&#xff0c;建造者模式也不例外。假设现在有一个场景&#xff0c;高校开学&#xff0c;学生、教师、职工都…

【新版HI3559AV100开发注意事项(二)】

#新版HI3559AV100开发注意事项&#xff08;二&#xff09; 十一、请问海思HI3559AV100 SPC030资料里面的HI3559ADMEB_VER_C_PCB.pcb是用什么软件打开啊&#xff1f; 答&#xff1a;PADS VX 2.2 Altium designer 十二、hi3559级联问题请教 在SDK的文档中只看到了两块Hi3559板…

ARM GIC(一) cortex-A 处理器中断简介

对于ARM的处理器,中断给处理器提供了触觉,使处理器能够感知到外界的变化,从而实时的处理。本系列博文,是以ARM cortex-A系列处理器,来介绍ARM的soc中,中断的处理。 ARM cortex-A系列处理器,提供了4个管脚给soc,实现外界中断的传递。分别是: nIRQ: 物理普通中断 nF…

利用Spark构建房价分析与推荐系统:基于58同城数据的大数据实践

利用Spark构建房价分析与推荐系统&#xff1a;基于58同城数据的大数据实践 基于Spark的房价数据分析预测推荐系统引言技术栈功能概述项目实现1. 数据爬取与处理2. 大数据分析与可视化3. 房价预测模型4. 协同过滤推荐系统5. Web应用开发6. 数据管理与用户管理 总结与展望 基于Sp…

优维科技荣获第二届中国赛宝信息技术应用创新优秀解决方案三等奖

近日&#xff0c;“第二届中国赛宝信息技术应用创新优秀解决方案”评选活动圆满结束。优维科技所提交的《Hyperlnsight超融合持续观测解决方案》、《EasyOps一体化运维平台》从全国近300份申报方案中脱颖而出&#xff0c;荣获2023中国赛宝信息技术应用创新优秀解决方案奖。 本…

Python - 深夜数据结构与算法之 Tree

目录 一.引言 二.树与二叉树简介 1.Tree 树 2.Binary Tree 二叉树 3.Binary Search Tree 二叉搜索树 三.经典算法实战 1.In-Order-Traversal [94] 2.Pre-Order-Traversal [144] 3.Fib [509] 4.N-Tree-Pre-Order-Traversal [589] 5.N-Tree-Post-Order-Traversal [590…

改变传媒格局的新趋势

在如今信息高速发展的时代&#xff0c;人们早已进入了一个以手机为中心的智能化时代。随着科技的迅猛发展&#xff0c;手机无人直播成为了一种新兴的传媒形态&#xff0c;正逐渐改变着传媒格局。本文将从手机无人直播的定义、发展背景和影响等方面进行探讨。 首先&#xff0c;…

浏览器缓存机制(详)

目录 1&#xff0c;缓存的分类1.1&#xff0c;按缓存位置1&#xff0c;Service Worker2&#xff0c;Memory Cache3&#xff0c;Disk Cache4&#xff0c;Push Cache 1.2&#xff0c;按缓存类型强缓存ExpiresCache-control 协商缓存Last-Modified & If-Modified-SinceEtag &a…

【优化】XXLJOB修改为使用虚拟线程

【优化】XXLJOB修改为使用虚拟线程 新建这几个目录 类&#xff0c; 去找项目对应的xxljob的源码 主要是将 new Thread 改为 虚拟线程 Thread.ofVirtual().name("VT").unstarted 以下代码是 xxljob 2.3.0版本 举一反三 去修改对应版本的代码 <!-- 定…

UG螺旋线命令的使用

螺旋线按照螺距类型可以分为两种类型&#xff1a; 1、等螺距螺旋线 2、变螺距螺旋线 等螺距螺旋线 变螺距螺旋线 沿矢量螺旋线 沿矢量螺旋线-线性大小和螺距 沿矢量螺旋线-沿脊线的线性 沿矢量螺旋线-沿脊线的线性 当我们想模拟弹簧被拉伸或压缩状态时&#xff0c;可以使用…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能&#xff0c;需要将对话内容流式返回给前端页面&#xff08;类似GPT的效果&#xff09;。下面直接说下如何实现&#xff1a; 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

智能化运输与航空航天:发展历程、问题与未来趋势

导言 智能化运输与航空航天是当前科技领域的研究热点之一&#xff0c;本文将深入研究这一领域的发展历程、遇到的问题、解决过程&#xff0c;以及未来的可用范围。同时&#xff0c;我们将探讨各国在这一领域的应用情况和未来的研究趋势&#xff0c;分析在哪些方面能够取胜&…

Java操作Word修订功能:启用、接受、拒绝、获取修订

Word的修订功能是一种在文档中进行编辑和审阅的功能。它允许多个用户对同一文档进行修改并跟踪这些修改&#xff0c;以便进行审查和接受或拒绝修改。修订功能通常用于团队合作、专业编辑和文件审查等场景。 本文将从以下几个方面介绍如何使用免费工具Free Spire.Doc for Java在…

数据挖掘体系介绍

数据挖掘是什么&#xff1f; 简而言之&#xff0c;对数据进行挖掘&#xff0c;从中提取出有效的信息。一般我们会把这种信息通过概念、规则、规律、模式等有组织的方式展示出来&#xff0c;形成所谓的知识。特别是在这个大数据时代&#xff0c;当数据多到一定程度&#xff0c;…

shell 数组的详细用法

简介 数组是一种数据结构&#xff0c;用于存储和处理一组相关的数据元素。数组可以包含多个值&#xff0c;每个值都有一个索引&#xff0c;用于标识和访问它们。 目录 1. 数组的基本用法 1.1. 定义数组的方式 1.1.1. 直接赋值 1.1.2. declare声明数组 1.1.3. 索引赋值 1.…

山景DU561—32位高性能音频处理器(DSP)芯片

音频处理可以更好地捕捉和处理声音和音乐&#xff1b;而DSP音频处理芯片是一种利用数字信号处理技术进行音频处理的专用芯片&#xff1b;可用于多种应用&#xff0c;从音乐拾音到复杂的音频信号处理&#xff0c;和声音增强。 由工采网代理的山景DU561是一款集成多种音效算法高…