都在说反射,反射到底是什么

概念:

什么是反射?

  1. 利用反射可以无视修饰符获取类里面所有的属性和方法
  2. 对于任何对象,都能够调用它的方法和属性,这种动态获取信息以及动态调用对象方法的功能称为Java的反射

反射的应用场景?

常见的有: idea的智能提示、框架等(通过反射技术对象类进行了解剖得到了类的所有成员。)

使用反射的步骤:

  1. 获取class对象
  2. 获取Construtor
  3. 创建对象

在这里插入图片描述

三种获取Class对象的方式:
  1. 类名.class
  2. 对象.getClass()
  3. Class.forName(类全名);
public class Demo01 {public static void main(String[] args) throws ClassNotFoundException {Class<Student> aClass = Student.class;System.out.println(aClass);Student student = new Student();Class<? extends Student> aClass2 = student.getClass();System.out.println(aClass2);Class<?> aClass3 = Class.forName("day20.Student");System.out.println(aClass3);}
}
Class获取构造方法对象:

在这里插入图片描述

方法名说明
Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()返回所有构造方法对象的数组
Constructor getConstructor(Class<?>… parameterTypes)返回单个公共构造方法对象
Constructor getDeclaredConstructor(Class<?>… parameterTypes)返回单个构造方法对象
public class Demo02 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {Class<?> aClass = Class.forName("day20.Student");// Constructor<?>[] getConstructors()	返回所有公共构造方法对象的数组Constructor<?>[] constructors = aClass.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}System.out.println("-----------------------------------");// Constructor<?>[] getDeclaredConstructors()	返回所有构造方法对象的数组Constructor<?>[] gdc = aClass.getDeclaredConstructors();for (Constructor<?> constructor : gdc) {System.out.println(constructor);}System.out.println("-----------------------------------");// Constructor getConstructor(Class<?>… parameterTypes)	返回单个公共构造方法对象//小括号中的顺序,一定要跟构造方法的形参保持一致.Constructor<?> constructor = aClass.getConstructor();System.out.println(constructor);Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class);System.out.println(constructor2);System.out.println("-----------------------------------");// Constructor getDeclaredConstructor(Class<?>… parameterTypes)	返回单个构造方法对象,不管还是公共都可以Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();System.out.println(declaredConstructor);}
}
反射创建对象方法:

Constructor类作用:

表示类中的构造方法

方法名说明
T newInstance(Object…initargs)通过构造方法创建对象
setAccessible(boolean flag)设置为true,表示取消访问检查
public class Test02 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {// 获取Class对象Class<?> aClass = Class.forName("day20.Student");// 获取构造方法,有参Constructor<?> constructor = aClass.getConstructor(String.class, int.class);// 获取构造方法,无参Constructor<?> constructor2 = aClass.getConstructor();// 获取构造方法,私有Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);// 暴力反射:用反射可以看到公共和私有的,但是被private修饰的成员是不可以直接使用的,如果要用要调用setAccessible临时取消访问检查,参数是truedeclaredConstructor.setAccessible(true);// 利用newInstance创建Student有参Student instance = (Student) constructor.newInstance("韩信", 19);// 利用newInstance创建Student无参Student instance2 = (Student) constructor2.newInstance();// 利用newInstance创建Student私有化Student instance3 = (Student) declaredConstructor.newInstance("itzhuzhu");System.out.println(instance);System.out.println("------------------");System.out.println(instance2);System.out.println("------------------");System.out.println(instance3);}
}
反射获取成员变量:

Field类的作用:

表示类中的成员变量

如果获取Field:

1.获取Class对象
2.通过Class对象获取Field

方法名说明
Field[] getFields ()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象
public class Demo03 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {Class<?> aClass = Class.forName("day20.Student");// Field[] getFields () 返回所有公共成员变量对象的数组Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field);}System.out.println("-----------------");// Field[] getDeclaredFields() 返回所有成员变量对象的数组Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}System.out.println("-----------------");// Field getField(String name)返回单个公共成员变量对象,如果是private修饰的是获取不到的Field field = aClass.getField("name");System.out.println(field);System.out.println("-----------------");// Field getDeclaredField(String name) 返回单个成员变量对象,private修饰的也可以获取Field declaredField = aClass.getDeclaredField("age");System.out.println(declaredField);}
}
反射赋值成员变量:
方法名说明
void set(Object obj, Object value)赋值
Object get(Object obj)获取值
public class Test {public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchFieldException {setMethod();getMethod();}private static void getMethod() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {Class<?> aClass = Class.forName("day20.Student");// 获取对象fanshe.demo.StudentaaaField declaredField = aClass.getDeclaredField("name");// 暴力反射declaredField.setAccessible(true);Student student = (Student) aClass.newInstance();Object o = declaredField.get(student);System.out.println(o);}private static void setMethod() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {// 获取class对象Class<?> aClass = Class.forName("day20.Student");// 获取对象Field field = aClass.getField("name");// set赋值Student student = (Student) aClass.newInstance();field.set(student, "韩信");System.out.println(student);}
}
获取成员方法并运行:

Method类作用

表示类中的方法

如何得到Method对象

1.获取Class对象
2.通过Class对象获取Method

方法名说明
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>… parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>… parameterTypes)返回单个成员方法对象
Object invoke(Object obj, Object… args)运行方法

学生类:

 public class Student {//私有的,无参无返回值private void show() {System.out.println("私有的show方法,无参无返回值");}//公共的,无参无返回值public void function1() {System.out.println("function1方法,无参无返回值");}//公共的,有参无返回值public void function2(String name) {System.out.println("function2方法,有参无返回值,参数为" + name);}//公共的,无参有返回值public String function3() {System.out.println("function3方法,无参有返回值");return "aaa";}//公共的,有参有返回值public String function4(String name) {System.out.println("function4方法,有参有返回值,参数为" + name);return "aaa";}}

测试类:

public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {Class<?> aClass = Class.forName("day20.Student");// Method[] getMethods()	返回所有公共成员方法对象的数组,包括继承的Method[] methods = aClass.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println("------------------");// Method[] getDeclaredMethods()	返回所有成员方法对象的数组,不包括继承的Method[] methods2 = aClass.getDeclaredMethods();for (Method method : methods2) {System.out.println(method);}System.out.println("------------------");// Method getMethod(String name, Class<?>… parameterTypes)	返回单个公共成员方法对象Method method = aClass.getMethod("function1");Method method2 = aClass.getMethod("function2", String.class);System.out.println(method);System.out.println(method2);System.out.println("------------------");// Method getDeclaredMethod(String name, Class<?>… parameterTypes)	返回单个成员方法对象Method show = aClass.getDeclaredMethod("show");System.out.println(show);System.out.println("------------------");// Object invoke(Object obj, Object… args)	运行方法 第一个参数是调用者,第二是调用方法传递的参数Method function4 = aClass.getMethod("function4", String.class);// 创建调用者Student o = (Student) aClass.newInstance();System.out.println(function4.invoke(o,"itzhuzhu"));}
}

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

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

相关文章

LaunchScreen原理

会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片.可以进入沙盒当中查看,查看方法,找到应用程序根目录.获取方法: NSLog("%",NSHomeDirectory());打印出…

Mac - 苹果电脑mac系统释放硬盘空间方法汇总

硬盘空间是大家最头痛的一个问题&#xff0c;大家在硬盘空间变小的时候怎么腾空间的呢&#xff1f;下面为大家分享7个mac系统释放空间的高级方法&#xff0c;大家赶紧来收了&#xff01; mac系统释放硬盘空间方法&#xff1a; 方法一&#xff1a;删除Emacs——可以节省出60MB的…

XML语言

XML&#xff1a; XML是可扩展的标记语言 标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展&#xff1a;标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 xml学习网站https://www.w3school.com.cn/x.asp 作用&#xf…

xml中的Document和Attribute

1.Document 导入dom4j的步骤 去官网下载 zip 包。http://www.dom4j.org/ 在项目中创建一个文件夹&#xff1a;lib将dom4j-2.1.1.jar文件复制到 lib 文件夹在jar文件上点右键&#xff0c;选择 Add as Library -> 点击OK在类中导包使用 得到Document对象 步骤&#xff1a;…

XPath表达式

什么是XPath XPath&#xff1a;路径表达式 作用&#xff1a;在DOM解析XML时&#xff0c;通过XPath表达让解析更加简单 XPath表达式分类 绝对路径相对路径全文搜索属性查找 什么是Node对象 DOM树中的每个节点就是Node dom4j中与XPath相关的方法 注&#xff1a;使用XPat…

最详细MySQL的安装与介绍Windows

数据库的安装&#xff1a; 打开下载的mysql安装⽂件双击解压缩&#xff0c;运⾏“mysql-5.5.40-win32.msi”。 选择安装类型&#xff0c;有“Typical&#xff08;默认&#xff09;”、“Complete&#xff08;完全&#xff09;”、“Custom&#xff08;⽤户⾃定义&#xff09;”…

读懂基础机器学习算法

本篇内容主要是面向机器学习初学者&#xff0c;介绍常见的机器学习算法&#xff0c;当然&#xff0c;欢迎同行交流。 哲学要回答的基本问题是从哪里来、我是谁、到哪里去&#xff0c;寻找答案的过程或许可以借鉴机器学习的套路&#xff1a;组织数据->挖掘知识->预测未来。…

在c语言中有函数leapyear定义如下,职业教育概论——职业教育的发展历史超星尔雅答案题库...

职业职业展历有时候,文学造诣高的中国诗歌翻译者在用词华丽方面超过莎士比亚。有int型变量x&#xff0c;教育教育i&#xff0c;j&#xff0c;k&#xff0c;则表达式x(i5,j6,k7)的值为( )从数据表student中查询张姓的所有学生&#xff0c;概论正确的SQL语句是( )史超世界上第一个…

tomcat安装启动配置

服务器&#xff1a; 服务器的概念非常的广泛&#xff0c;它可以指代一台特殊的计算机&#xff08;相比普通计算机运行更快、负载更高、价格更贵&#xff09;&#xff0c;也可以指代用于部署网站的应用。我们这里说的服务器&#xff0c;其实是web服务器&#xff0c;或者应用服务…

JS在页面限制checkbox最大复选数

应该是挺简单的代码, 记录一下分享. 首先最直接的想法就是使用循环, 用局部变量记录已选的checkbox, 达到最大值就将余下的checkbox都禁止选择, 例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ""> <html xmlns"…

c语言 二维数组 文库,c语言二维数组练习题

c语言二维数组练习题 (3页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;19.90 积分完成下列程序代码完成下列程序代码1、 将二维数组(5 行 5 列)的右上半部分置零。 即&#xff1a;1234510000678910…

android陀螺仪轨迹,陀螺仪轨迹法长距离管道测量精度实测分析

陀螺仪轨迹法长距离管道测量精度实测分析陀螺仪轨迹法用于非开挖管道的精准坐标与位置测量已被电力与燃气等行业逐步了解与接受&#xff0c;近两年不断被引入到城市地下管线探测及电力与燃气管道验收标准中。由于管道埋于地下往往不能眼见为实&#xff0c;作为一种新的测量方式…

Spring IOC详解与配置

Spring&#xff1a; 框架&#xff1a; 具有一定功能的半成品软件&#xff0c;基于框架会节省开发成本 框架作用&#xff1a; 提高开发效率、复用性、编写规范、节约维护成本、解耦底层实现原理 Spring&#xff1a; Spring是分层的JavaSE/EE应用full-stack轻量级开源框架Sprin…

android8.0的蓝牙版本,android o 新特性详解 安卓8.0蓝牙音频增强以及更加可爱的表情包...

android 8.0什么时候推出&#xff1f;有哪些新特色&#xff1f;很多安卓用户非常想知道答案吧&#xff01;不用着急&#xff0c;下面是大麦子小编整理出来的安卓8.0新特性详解&#xff0c;希望可以帮到大家。有媒体近日曝光了有关谷歌Pixel XL 2手机会首发Android 8.0系统。现在…

DOM初级篇

DOM是什么、作用、与javascript&#xff1f; DOM是对HTML文档的访问和操作&#xff0c;对文档的增删改查。 DOM相当于是javascript一个类&#xff0c;这个类中提供了多种操作HTML的方法&#xff0c;也可以说DOM是依附在JavaScript上进行操作的。 一、标签的查找命令&#xff1b…

vs2019开发android应用,VS 2019开发APP(一)界面和代码

1.界面在Resources>layout>目录下的*.xml文件就是界面文件2.关联界面接下来&#xff0c;通过将支持代码插入到 MainActivity 类中来添加代码以关联用户界面。在 MainActivity 类中找到 OnCreate 方法&#xff0c;在其中添加关联按钮代码如下&#xff1a;protected overri…

oracle 数据库字段html显示正常text显示不全,layui表格字段表格显示不全(自适应)...

本文将为您描述layui表格字段表格显示不全(自适应),具体操作方法:好记性不如烂笔头。本来就是没什么好记得东西&#xff0c;下次再用时已经想不起来了。问题如下&#x1f41f;使用layui表格&#xff0c;表格字段显示不全&#xff0c;如果超出分配的位置&#xff0c;就会显示省略…

使用 VSCode 编写 .NET Core 项目之初体验

注&#xff1a;本文在根据 微软官方文档指导下&#xff0c;根据自己的学习中整理&#xff0c;并不完全照搬文档&#xff0c;但也大体和文档学习路线相似&#xff0c;主要为记录学习过程。 官方学习地址&#xff1a; https://code.visualstudio.com/docs/other/dotnet https://d…

html模板安装到织梦,织梦网站安装教程 织梦模板通用安装图文教程

织梦模版怎么安装使用呢 下面就把我的经验分享给大家解压文件上传到服务器指定根目录输入主域名访问“例如&#xff1a;//www.jb51.net/install”步骤1&#xff1a;勾选同意协议&#xff0c;点击继续按钮。步骤2&#xff1a;检查系统环境和文件权限&#xff0c;确定权限正确才能…

金乡高考成绩查询2021,金乡一中举行2021届高三年级一模成绩分析暨表彰大会!现场颁奖...

集思广益查缺补漏&#xff0c;全力以赴保驾护航。为增强备考紧迫性&#xff0c;提高备考有效性&#xff0c;激发师生积极性&#xff0c;2021年3月22日晚&#xff0c;山东省金乡一中2021届高三年级一模成绩分析暨表彰大会&#xff0c;在文峰楼二楼报告厅召开&#xff0c;本次会议…