JavaEE企业开发新技术2

目录

2.7 Field类的基本概念

文字性概念描述:

Field类

2.8  Field的基本操作-1

2.9 Field的基本操作-2

分析:

2.10 Field 的综合练习

总结:

==和equals的区别:

使用 == 比较

使用equals比较 

2.7 Field类的基本概念

文字性概念描述:

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

(1)得到类的所有构造方法

Constructor constructors

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

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

Constructor constructor=

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

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

正常情况:

string str=new string(“hello”);

反射情况:

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

String str=(string)con.newinstance(“hello”);

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

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

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

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

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

Field类

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

  1. Class.gelFields():得到Class对象的所有字段,返回的是Field数组。
  2. Class.getField(String name)返回一个 Field 对象,它反映此 Class对象所表示的类或接口的指定公有成员字段。
  3. Field的对象所代表的某一个类的属性,而不是那个类的某一个对象的属性。要得到某个对象对应的属性值,需要通过get(0bject obj)方法与某个对象具体关联。
  4. 对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到。
  5. 对于私有属性要得到它所关联到的对象的值,需通过Field的setAccessible(boolean boolean)方法设置。(boolean类型设置为true就可以访问私有属性)
  6. Field类的getType()方法用来得到字段所属的类型

2.8  Field的基本操作-1

公有属性:

public String sex;

重载的有参构造方法:

public Person(Integer id,String name,String sex) {this(id,name);this.sex=sex;}

测试类:

public class Test2 {public static void main(String[] args) throws NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {Person p1=new Person();Class clazz1=p1.getClass();System.out.println(clazz1==Person.class);Person p=(Person)clazz1.getConstructor(Integer.class,String.class,String.class).newInstance(100,"小明","男");//通过反射创建Field[] fields=clazz1.getFields();//得到所有公有的属性for(Field f:fields) {System.out.println("类型:"+f.getType().getName()+"属性名称:"+f.getName());//输出公有属性}Field field=clazz1.getDeclaredField("name");//设置访问私有的name属性field.setAccessible(true);//允许访问私有的属性System.out.println(field.get(p));}
}

运行结果:

2.9 Field的基本操作-2

通过getDeclaredFields()方法可以得到指定类中定义的所有属性:

代码:

Field[] fields2=clazz1.getDeclaredFields();//得到该类中定义的所有字段for(Field f:fields2) {System.out.println("类型:"+f.getType().getName()+"属性名称:"+f.getName());}

分析:

Field: 一般情况我们需要调用方法得到该类中定义的字段,要么得到所有的字段,要么得到某一个字段得到字段之后,一般情况我们需要得到该字段在某一个对象上的取值

通常如果我们要拿到某个私有的属性时需要用getDeclaredField(属性名称)方法,用该方法拿到私有属性时,需要用setAccessible(boolean boolean)设置为true,表示允许访问私有的属性,最后看字段在某个对象上的取值,则调用get(object obj)方法就能拿到

2.10 Field 的综合练习

练习:扫描一个对象中所有的字符串类型的属性,并为每一个字符串属性的值后面添加“hello”字符串,然后将这个对象输出。

private Integer id;private String name;public String sex;int statue;protected String booldType;
public Person(Integer id, String name, String sex, int statue, String booldType) {this(id,name,sex);//在构造方法体中调用重载的构造方法this.statue = statue;this.booldType = booldType;}

Person p=(Person)clazz1.getConstructor(Integer.class,String.class,String.class,int.class,String.class).newInstance(100,"小明","男",1,"O型血");Field[] fields2=clazz1.getDeclaredFields();//得到该类中定义的所有字段for(Field f:fields2) {if(f.getType()==String.class) {//判断得到的类型是否是String类型f.setAccessible(true);//设置为true可以访问私有属性String oldValue=(String)f.get(p);String newValue=oldValue.concat("hello");//将得到的属性值后面追加“hello”//得到新的属性值之后,还需要将新值设置给原来对象f.set(p, newValue);}}System.out.println("设置完新值后的对象是:"+p);

运行结果:

总结:

Class.gelFields()可以得到Class对象的所有字段,返回Field数组。

Class.getField(String name)返回一个 Field 对象,它可以指定公有成员字段。

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

对于非公有属性只能通过Class的getDeclaredField(String fieldName)方法得到,可以指定非公有成员字段。

对于私有属性要得到它所关联到的对象的值,需要用到Field的setAccessible(boolean boolean)方法设置。(boolean类型设置为true就可以访问私有属性)

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

==和equals的区别:

使用 == 比较

Java中的8种基本数据类型(byte,short,char,int,long,float,double,boolean)比较他们之间的值是否相等。

引用数据类型,比较的是他们在堆内存地址是否相等。每新new一个引用类型的对象,会重新分配堆内存空间,使用==比较返回false。

使用equals比较 


  引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法

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

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

相关文章

.NET高级面试指南专题十七【 策略模式模式介绍,允许在运行时选择算法的行为】

介绍: 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它定义了一系列算法,将每个算法封装到一个对象中,并使它们可以互相替换。这使得算法可独立于使用它的客户端变化。 原理: 策略接口(Strat…

CVPR2024 | 大核卷积新高度101x101,美团提出PeLK

https://arxiv.org/pdf/2403.07589.pdf 本文概述 最近,一些大核卷积网络以吸引人的性能和效率进行了反击。然而,考虑到卷积的平方复杂度,扩大内核会带来大量的参数,而大量的参数会引发严重的优化问题。由于这些问题,当…

安卓之四大组件

组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表 Activity组件启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运…

蓝桥杯刷题|01入门真题

[蓝桥杯 2020 省 AB1] 解码 题目描述 小明有一串很长的英文字母,可能包含大写和小写。 在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 出现次数的形式。 例如,连续…

Xcode 15.3 Archive失败

Xcode 15.3 Archive失败 背景 升级 Xcode 到 15.3,真机运行正常。打包的时候发现 Archive 失败。 提示: Call parameter type does not match function signature! 仔细看报错里是和HandyJSON相关的提示。 解决 起初以为和 Pod 库有关系,…

docker容器启动rabbitmq

docker容器启动rabbitmq 一、RabbitMQ部署1.1.在线拉取mq镜像1.2.运行mq容器1.3.访问mq 二、RabbitMQ的集群2.1.集群分类2.1.设置 /etc/hosts文件 endl 一、RabbitMQ部署 1.1.在线拉取mq镜像 # 在线拉取 docker pull rabbitmq:3-management1.2.运行mq容器 docker run \ -e R…

什么是单向数据流

单向数据流是一种数据流动的模式,通常用于前端框架(如 React、Vue 等)中。在单向数据流中,数据只能从一个方向流向另一个方向,不会出现数据的双向流动。这种模式有助于简化数据的管理和状态的维护,提高代码…

Kafka-生产者报错javax.management.InstanceAlreadyExistsException

生产者发送消息到 kafka 中,然后控制台报错 然后根据日志查看 kafka 的源码发现了问题原因 说的是MBean已经注册了,然后报异常了,这样就会导致生产者的kafka注册失败, 原因是项目上生产者没有配置clientId,默认都是空导致的, 多个生产者(项目)注册到kafka集群中的 id 都相同。 …

微服务分布式基于Springcloud的拍卖管理系统597wx

越来越多的用户利用互联网获得信息,但各种信息鱼龙混杂,信息真假难以辨别。为了方便用户更好的获得信息,因此,设计一种安全高效的拍卖管理系统极为重要。 为设计一个安全便捷,并且使用户更好获取拍卖管理系统&#xff…

在Linux/Ubuntu/Debian中使用lsof和fuser查看/解除文件占用

“lsof”(列出打开的文件)和“fuser”(使用文件识别进程)类似,但功能略有不同: 1.lsof: - lsof 列出有关进程打开的文件的信息。 它提供有关打开哪些文件、哪些进程正在访问这些文件以及其他相…

探寻殷墟文化,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建殷墟考古场景下的甲骨文字符检测识别分析系统

甲骨文是一种非常历史悠久的古老文字,在前面我们基本上很少有涉及这块的内容,最近正好在做文字相关的项目开发研究,就想着基于甲骨文的场景来开发对应的检测识别系统,在前文中我们基于系列YOLO算法模型开发构建了在仿真数据实验场…

C#,图论与图算法,图着色问题(Graph Coloring)的威尔士-鲍威尔(Welch Powell Algorithm)算法与源代码

Welsh, D.J.A. and Powell, M.B. (1967) An Upper Bound for the Chromatic Number of a Graph and Its Application to Timetabling Problems. 《The Computer Journal》, 10, 85-86. 《The Computer Journal》 1 图着色算法概述 1967年,Welsh和Powell算法引入了…

unity学习笔记 Restsharp 使用心得

Restsharp Restsharp安装使用注意事项api方式的流式调用--子线程中执行代码无响应的问题问题描述问题解决其他问题 Restsharp 安装 可以在github上下载dll文件然后导入到unity中 https://github.com/adrenak/RestSharp.Unity 也可以百度直接搜Restsharp然后下载相关的文件导入…

Rudolf and the Ball Game

传送门 题意 思路 暴力枚举每一个妆台的转换条件 code #include<iostream> #include<cstdio> #include<stack> #include<vector> #include<algorithm> #include<cmath> #include<queue> #include<cstring> #include<ma…

GO sync.pool学习笔记

sync.Pool 是 Go 语言标准库中提供的一个对象池&#xff0c;用于管理临时对象的分配和重用&#xff0c;以减少内存分配的开销。下面是 sync.Pool 的基本使用方法&#xff1a; 初始化 Pool&#xff1a;首先&#xff0c;你需要创建一个 sync.Pool 实例&#xff0c;一般使用 sync…

Python数据分析-4

1.对于一组电影数据&#xff0c;呈现出rating,runtime的分布情况&#xff1a; #encodingutf-8 import pandas as pd import numpy as np from matplotlib import pyplot as plt file_path "./youtube_video_data/IMDB-Movie-Data.csv" df pd.read_csv(file_path) …

浏览器插件开发初体验(URL OPENER)

https://github.com/sxei/chrome-plugin-demo 参考资料 需求&#xff1a; 1、对于一串文本&#xff0c;提取其中的urls并打开这些url。 2、提取浏览器所有tabs的url和title 例如&#xff1a; // https://www.cnblogs.com/kelelipeng/p/17129941.html // https://www.ruanyifen…

AJAX 05 axios拦截器、数据管理平台

AJAX 学习 AJAX 05 黑马头条-数据管理平台项目准备业务1&#xff1a;验证码登录bootstrap提示框实际业务中的验证码登录token 【注】HTML遗落的知识【注】JS遗漏的知识业务2&#xff1a;个人信息设置 & axios拦截器axios请求拦截器axios响应拦截器 业务3&#xff1a;发布文…

9种分布式ID生成之美团(Leaf)实战

​​​​​ 前几天写过一篇《一口气说出 9种 分布式ID生成方式&#xff0c;面试官有点懵了》&#xff0c;里边简单的介绍了九种分布式ID生成方式&#xff0c;但是对于像美团&#xff08;Leaf&#xff09;、滴滴&#xff08;Tinyid&#xff09;、百度&#xff08;uid-generator&…

Unity3D MMORPG角色的UI血条管理详解

前言 在Unity3D游戏开发中&#xff0c;MMORPG&#xff08;Massively Multiplayer Online Role-Playing Game&#xff09;游戏是一种非常流行的游戏类型。在这种类型的游戏中&#xff0c;玩家通常可以选择不同的角色来进行游戏&#xff0c;而角色的血条管理是游戏中非常重要的一…