java反射基础知识

1.java的反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

2.反射的基础---Class

要想知道一个类的属性和方法,必须先获取到该类的字节码文件对象。获取类的信息时,使用的就是 Class 类中的方法。所以先要获取到每一个字节码文件(.class)对应的 Class 类型的对象.
class(包括interface)的本质是数据类型(Type)。class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。每加载一种class,JVM就为其创建一个Class类型的实例,并关联

2.1 什么是反射?

由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段(成员变量)等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。这种通过Class实例获取class信息的方法称为反射(Reflection)。

2.2获取Class的三个方法:

  • 通过一个Class的静态变量Class获取:
Class cls=String.class;
  •  如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
String s="Hello";
Class cls=s.getClass();
  •  如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:
Class cls=Class.forName("java.lang.String");

 2.3 Class的常用方法

 2.4动态加载机制

JVM在执行Java程序的时候,并不是一次性把所有用到的class全部加载到内存,而是第一次需要用到class时才加载。

Public class Main{static{System.out.println("Main被加载");}public static void main(String[] args){int rand=new Random().nextInt(10);if(rand>5){create(rand);}}static void create(int no){Person p=new Person(no);}
}
class Person{static{System.out.println("Person类被加载");}public Person(int no){System.out.println("Person类的有参构造方法");}
}

当执行Main.java时,由于用到了Main,因此,JVM首先会把Main.class加载到内存。然而,并不会加载Person.class,除非程序执行到create()方法,JVM发现需要加载Person类时,才会首次加载Person.class。如果没有执行create()方法,那么Person.class根本就不会被加载。

3.Constructor类

Constructor类用来描述类中所定义的构造方法。

1.得到类所有的构造方法

Constructor constructors[]=

Class.forName(“java.lang.String”).getConstructors();

2.得到类中某个具体的构造方法,在getConstructors中传入参数类型所对应的字节码

Constructor constructor=

Class.forName(“java.lang.String”).getConstructor(String.class)

使用Constructor类的目的是用来创建响应类的对象

正常情况:

String str = new String(“hello”);

反射情况:

Constructor con = String.class.getConstructor(String.class)

拿到string类型的构造方法

String str = (String)con.newlnstance(“hello”)

通过反射方式创建对象的过程

Class---->Constructor---->某个类的对象

只有当要用某个无参构造方法创建该类对象时,可以省略创建Constructor类对象的这个过程。

Date d = (Date)Class.forName(“java.util.Date”).newlnstance();

注意:java运行环境的缓存中保存了类的无参构造方法所对应的Constructor对象。

Field类

Field类是用来表示类中的属性(字段)

(1) Class.getPields0:得到Class对象的所有字段,返回的是riela数组。

(2) Class. getField (String: name)返回个 Field 对象,它反映此 Class对象所表示的类或接口的指定公有成员字段。

(3) Field的对象所代表的某-一个类的属性,而不是那个类的某一个对象的属性。要得到某个对象对应的属性值,需要通过get (0b ject obj)方法与某个对象具体关联

(4)对于非公有属性只能通过Class的getDec laredField (String fieldName)方法得到。

(5)对于私有属性要得到它所关联到的对象的值,需通过Field的setAccessible (boolean boolean)方法设置。

(6) Field类的getType Q方法用来得到字段所属的类型

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

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

相关文章

学生管理系统1.0版本

学生管理系统1.0版本有5个功能,即添加学生、删除学生、修改学生、查看全部学生、退出系统。 里面对添加重复学号、删除和修改不存在的学号等问题都有相应的解决办法。 代码区: Student.java package student;//快捷键Altinsert public class Student …

Machine Learning Specialization 学习笔记(4)

文章目录 前言一、模型评估训练集常规训练集线性回归逻辑回归 交叉验证集 偏差与方差正则化 学习曲线数据集的添加(数据增强)迁移学习精确率与召回率 二、决策树基本概念决策树的工作原理决策树的优点决策树的缺点决策树算法的变体决策树在Python中的实现…

Shell 脚本学习

Shell学习 Shell 脚本 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…

ArcGIS核密度分析(栅格处理范围与掩膜分析)

多时候我们在进行栅格分析的时候&#xff0c;处理的结果不能完全覆盖我们需要的范围。 比如&#xff0c;我们对点数据进行密度分析、栅格插值等。比如下图 为什么会如此呢&#xff1f; 那是因为在做这个密度分析或者栅格插值的时候&#xff0c;默认是以点的四至范围来生成的&am…

LeetCode 热题 100 回顾9

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

算法之逻辑斯蒂回归(Logistic regression)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 逻辑斯蒂回归&#xff08;Logistic Regression&#xff09;是统计学中一种广泛应用于二分类问题的算法。它的主要目标是预测二分类问题中的事件发生的概率。尽管名字里有“回归”&#xff0c;但逻…

2024已然过半,AI技术卷到哪儿了?

可以说&#xff0c;科技的发展真的是日新月异&#xff0c;2024年年初&#xff0c;大模型Sora的出现&#xff0c;改变了短视频行业的演变方向&#xff0c;使得AI技术不再只是停留在文生文&#xff0c;文生图阶段&#xff0c;而是发展到了文生视频领域。2024年5月&#xff0c;回忆…

Java笔试面试题AI答之设计模式(5)

文章目录 21. 简述Java什么是适配器模式 ?适配器模式的主要组成部分包括&#xff1a;适配器模式的实现方式主要有两种&#xff1a;适配器模式的优点&#xff1a;适配器模式的缺点&#xff1a;示例说明&#xff1a; 22. 请用Java代码实现适配器模式的案例 &#xff1f; 21. 简述…

OpenCL 学习(2)---- OpenCL Platform 和 Device

目录 OpenCL PlatformOpenCL Device参考代码 OpenCL Platform opencl 支持的 Platform 可以使用 clGetPlatformIDs 函数查询&#xff0c;函数原型如下&#xff1a; clGetPlatformIDs(cl_uint /* num_entries */,cl_platform_id * /* platforms */,cl_uint * …

深度之眼(三十)——pytorch(一)--深入浅出pytorch(附安装流程)

文章目录 一、前言一、pytoch二、六个部分三、如何学习四、学习路径&#xff08;重要)五、安装pytorch5.1 坑15.2 坑2 一、前言 我看了下目录 第一章和第二章都是本科学的数字图像处理。 也就是这一专栏&#xff1a;数字图像实验。 所以就不准备学习前两章了&#xff0c;直接…

神奇的可变模板参数的应用(C++标准库双向链表 list 中的emplace函数实现)

我们先来看一个可以构造任意对象的函数&#xff1a; /// <summary> /// 可以构造任意对象的函数 /// </summary> /// <typeparam name"MyClass">要转换对象的类型</typeparam> /// <typeparam name"...MyClassConstructorParameterT…

新手上路:在Windows CPU上安装Anaconda和PyCharm

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一. 确认自己是CPU为什么选择CPU教程&#xff1f;GPU与CPU的区别如何判断自己是CPU 二. Anaconda 安装包 和 Pycharm 安装包步骤1&#xff1a;下载Anaconda步骤2&am…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片&#xff1f;您&#xff0c;无需惊慌&#xff0c;因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone&#xff0c;您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如&#xff0c;您的所有照片都会自动备份到 iCloud 存…

5分钟内理解 .prototype 链 | 2024

在JavaScript的世界里,原型(prototype)系统是一个常被讨论但不易掌握的概念。作为JavaScript继承模型的基石,理解原型对于构建大型应用或进行对象操作至关重要。让我们一起探索这个迷人的话题,揭开原型系统的神秘面纱。 什么是原型? 在JavaScript中,每个对象都有一个内部属性[…

常见中间件漏洞(Jboss)靶场

1.CVE-2015-7501 开启环境查看端口 http://192.168.10.194:8080/ invoker/JMXInvokerServlet 说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码 bash -i >& /dev/…

C++ Qt 之 QPushButton 好看的样式效果实践

文章目录 1.前序2.效果演示3.代码如下 1.前序 启发于 edge 更新 web 页面&#xff0c;觉得人家做的体验挺好 决定在Qt实现&#xff0c;方便以后使用 2.效果演示 特性介绍&#xff1a; 默认蓝色鼠标移入 渐变色&#xff0c;鼠标变为小手鼠标移出 恢复蓝色&#xff0c;鼠标恢…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案&#xff08;如何主动屏蔽报错&#xff09; 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

前端——JavaScript练习 做一个todoList

用前端制作一个todoList的表格&#xff0c;实现更新、删除、修改等功能。 涉及几个知识点&#xff1a; 设置最小高度&#xff08;宽度&#xff09;&#xff1a; .container{min-width: 350px;/* 最小宽度 最小不会小于210px */ } 去掉外轮廓 outline: none; 去除字…

寄存器与内存

第三课&#xff1a;寄存器与内存、中央处理器&#xff08;CPU&#xff09;、指令和程序及高级 CPU 设计-CSDN博客 锁存器 引入 ABO0&#xff08;开始状态&#xff09;001&#xff08;将A置1&#xff09;110&#xff08;将A置0&#xff09;11 无论怎么做&#xff0c;都没法从1变…